0

为什么您在下面看到的代码会给出这些结果?

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

整数 x 是:65

int 移位 y 为:16640

整数 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

我的问题是我有两个字节要从加速度计的数据寄存器中读取。该值存储在二进制补码中,因此我想检查一下,因为wire.read返回一个字节,有人说它是有符号的,如果我销毁这些值,则返回一个无符号的字节,因为我必须进行一些移位。

所以我想检查我是否有一个字节,我尝试将它移动并将它存储到一个 int,我得到什么值,我想测试我是否可以以某种方式将有符号字节值存储在一个字节数组中。

4

2 回答 2

3

仅仅因为你写了一个“看起来像二进制”的数字,因为它有很多 1 和 0,并且是 8 位宽,并不能让它神奇地成为二进制文字。你会怎么期待:

byte x = 100;

byte x = 100;

要知道该值应该是 100 10(一百还是 100 2(四)?

事实上,C(和 C++)甚至没有内置二进制文字:以 开头的数字文字0被解释为octal,base 8。

于 2013-04-10T10:08:14.013 回答
2

上面显示的答案是正确的,因为 Alexy Frunze 说以 0 开头的数字是 octal 。

000000101 is 65 not 5
65 << 8 =16640
10000001 in decimal is 129
129+65 = 194
于 2013-04-10T10:17:41.607 回答