6

我的小程序:

#include <stdio.h>

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

打印:

-128

减号 (-) 运算符是否可跨 CPU 移植?

4

3 回答 3

9

一元减号的操作数首先经过标准的承诺,所以它是类型int,可以表示值-128。操作的结果是值128,也是类型intint从to的转换signed char是有符号类型的缩小范围,是实现定义的。

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

于 2013-07-04T12:10:00.803 回答
4

注意:-128在 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
    
于 2013-07-04T12:08:41.640 回答
1

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

-128 = 0x80

neg 做的是反转它并加 1

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

达哈,你又得到了 0x80

于 2013-07-04T12:09:10.450 回答