为什么下面看到的代码会给出这些结果?
void loop() {
byte test = 00000101;
Serial.print("The byte test is: ");
Serial.println(test);
int x = (int)test;
int y = (int)test<<8;
Serial.print("The int x is: ");
Serial.println(x);
Serial.print("The int shifted y is: ");
Serial.println(y);
byte tost = 10000001;
int z = test + tost;
Serial.print("The int z is: ");
Serial.println(z);
delay(1000);
}
结果:
字节测试是:65
int x是:65
int shift y是:16640
int z是:194
如果我将测试更改为00000001,那么它表现得很好:
更改了代码:
void loop() {
byte test = 00000001;
Serial.print("The byte test is: ");
Serial.println(test);
int x = (int)test;
int y = (int)test<<8;
Serial.print("The int x is: ");
Serial.println(x);
Serial.print("The int shifted y is: ");
Serial.println(y);
byte tost = 10000001;
int z = test + tost;
Serial.print("The int z is: ");
Serial.println(z);
delay(1000);
}
结果:
The byte test is: 1
The int x is: 1
The int shifted y is: 256
The int z is: 130
我的问题是我有两个字节要从加速度计的数据寄存器中读取。该值存储在two's complement中,所以我想检查,因为wire.read
返回一个字符,有人说这是签名的,有些是无符号的,如果我销毁了值,因为我必须做一些移位。
所以我想检查一下是否有一个字节,我试图将它移位并存储到一个int,我得到了什么值,我想测试一下我是否能在字节数组中存储有符号的字节值。
答案 0 :(得分:3)
仅仅因为你写了一个“看起来是二进制”的数字,因为它有很多1和0并且是8位宽,所以它不会神奇地成为二进制文字。您期望如何:
byte x = 100;
和
byte x = 100;
知道这个值应该是100 10 (一个是亨利还是100 2 (四个)?
实际上,C(和C ++)甚至没有内置的二进制文字:以0
开头的数字文字被解释为 octal ,基数为8。
答案 1 :(得分:2)
上面显示的答案是正确的,因为Alexy Frunze说从0开始的数字是八进制。
000000101 is 65 not 5
65 << 8 =16640
10000001 in decimal is 129
129+65 = 194