C中有符号的单字节字符是什么 – ( – 128)?

我的小程序:

#include  int main() { signed char c = -128; c = -c; printf("%d", c); return 0; } 

打印:

 -128 

减号( – )运算符是否可以跨CPU运行?

一元减号的操作数首先经历标准的承诺,因此它的类型为int ,它可以表示值-128 。 操作的结果是值128 ,也是int类型。 从intsigned 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 

现在,

  1. 此值将被解释为负值,因为MSB为1
  2. 打印所需的-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