Arduino Serial.print(,BIN)奇怪的行为

时间:2014-06-06 16:53:51

标签: c++ arduino

代码:

char a = 0x70;
char b = 0x80;

Serial.println(a, BIN); // Should print  1110000
Serial.println(b, BIN); // Should print 10000000

输出:

1110000
11111111111111111111111110000000

我知道这与第一位有关,使得它成为负数,并且可能会尝试默认将其打印为int?但是,char unsigned不会改变这一点。

2 个答案:

答案 0 :(得分:1)

这是受到@Ben关于这个问题的评论的启发。似乎Serial.println((unsigned char)b, BIN);获得了所需的输出。

这是我的完整草图:

void setup() {
  Serial.begin(9600);
  // Confirm observations from question
  char a = 0x70;
  char b = 0x80;

  long aPrint = Serial.println(a, BIN); // Should print  1110000
  long bPrint = Serial.println(b, BIN); // Should print 10000000

  // Output println results (Ben comment #1)
  Serial.print("aPrint: ");
  Serial.println(aPrint);
  Serial.print("bPrint: ");
  Serial.println(bPrint);

  // Explicit cast from char
  Serial.print("(int)b: ");
  Serial.println((int)b);

  // Via unsigned char
  Serial.print("(unsigned char)b: ");
  Serial.println((unsigned char)b);
  // And print in binary
  Serial.println((unsigned char)b, BIN);
}

void loop() {
}

输出:

1110000
11111111111111111111111110000000
aPrint: 9
bPrint: 34
(int)b: -128
(unsigned char)b: 128
10000000

答案 1 :(得分:0)

char似乎是您计算机上的签名类型。这意味着当您将其传递给期望println的{​​{1}}时,它会获得您在此处看到的值sign-extended。使用其他答案中建议的演员表或切换到int

修改:我注意到您的帖子说使用unsigned char并没有帮助。这可能表明API在内部做了一些有趣的事情。