将字节和剩余值转换为int(对二进制补码感兴趣)

时间:2013-04-10 10:00:37

标签: c optimization casting arduino

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

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,我得到了什么值,我想测试一下我是否能在字节数组中存储有符号的字节值。

2 个答案:

答案 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