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

时间:2013-07-04 12:02:54

标签: c cpu instruction-set

我的小程序:

#include <stdio.h>

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

打印:

-128

负( - )运算符是否可以在CPU上移植?

3 个答案:

答案 0 :(得分:9)

一元减去的操作数首先经历标准的承诺,因此它的类型为int,可以表示值-128。操作的结果是值128,也是类型int的值。从intsigned char的转换是签名类型的缩小,是实现定义的。

(您的实现似乎做了一个简单的环绕:125,126,127,-128,-127,......)

答案 1 :(得分:4)

注意:2的补码中的-1281000 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
    

答案 2 :(得分:1)

因为一个字节(char)不能容纳128

-128 = 0x80

做什么是反转它加上1

-(-128) = (~0x80) + 1 = 0x7F + 1 = 0x80

daha,你又得到了0x80