C中有符号的单字节字符是什么 – ( – 128)?
我的小程序:
#include int main() { signed char c = -128; c = -c; printf("%d", c); return 0; }
打印:
-128
减号( – )运算符是否可以跨CPU运行?
一元减号的操作数首先经历标准的承诺,因此它的类型为int
,它可以表示值-128
。 操作的结果是值128
,也是int
类型。 从int
到signed char
的转换是签名类型的缩小,是实现定义的。
(你的实现似乎做了一个简单的环绕:125,126,127,-128,-127,……)
注意: -128
in 2的补码是1000 0000
(在一个字节中), 128
也是1000 0000
。 如果你做char c = 128
并打印它将是-128
原因如下:
char变量= 128值存储在存储器中如下。
MSB +----+----+----+---+---+---+---+---+ | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----+----+----+---+---+---+---+---+ 7 6 5 4 3 2 1 0
现在,
- 此值将被解释为负值,因为MSB为
1
, -
打印所需的-ve数2的补码的大小,即一个字节中的
128
,因此输出为:-128
2的补充:
1000 0000 0111 1111 1's complement + 0000 0001 ----------- 1000 0000 2's complement Magnitude = 128 So in one byte 128 == -128
因为一个字节(char)不能容纳128
-128 = 0x80
做什么是扭转它加1
-(-128) = (~0x80) + 1 = 0x7F + 1 = 0x80
大哈,你又得到了0x80