Arduino 中有符号整数和无符号整数的区别
定义整数时,默认情况下是有符号的。换句话说,它可以接受正值和负值。无符号整数顾名思义,只接受正值。因此,它们的范围更大。
如果使用一个使用两个字节(16 位)来表示整数的开发板,那么无符号整数的最大范围是 0 到 65535 (216-1)。
然而,在表示有符号整数时,范围将是 -32767 到 +32767。注意 32767 对应于 (215 -1)。正如你所看到的,最高有效位似乎没有作用。最高有效位实际上用于确定符号(正数为 0,负数为 1),其余 15 位使用二进制补码表示数字的值。 你可以在这里阅读更多相关信息:https://en.wikipedia.org/wiki/Two%27s_complement。
同样,如果使用的开发板使用 4 个字节(32 位)来表示整数,则无符号整数的范围将是从 0 到 4,294,967,295 (232 - 1),而有符号整数的范围将是从 – 2147483647 到 +2147483647。注意 2147483647 对应于 (231 - 1)。
如果尝试从较小的数字中减去较大的数字,并尝试将结果赋值给无符号整数,则会导致整数溢出(因为无符号整数无法处理负数)。请参见下面的代码:
示例
void setup() { Serial.begin(9600); Serial.println(); int x = 10; int y = 20; int z = x-y; unsigned int w = x-y; Serial.println(z); Serial.println(w); } void loop() { // put your main code here, to run repeatedly: }
串口监视器输出为:
输出
正如你所看到的,整数z能够存储负值。但是无符号整数w无法做到这一点,它反而打印了 (232 – 10) 而不是 -10。
广告