我的小程序:
#include <stdio.h>
int main() {
signed char c = -128;
c = -c;
printf("%d", c);
return 0;
}
打印:
-128
负( - )运算符是否可以在CPU上移植?
答案 0 :(得分:9)
一元减去的操作数首先经历标准的承诺,因此它的类型为int
,可以表示值-128
。操作的结果是值128
,也是类型int
的值。从int
到signed char
的转换是签名类型的缩小,是实现定义的。
(您的实现似乎做了一个简单的环绕:125,126,127,-128,-127,......)
答案 1 :(得分:4)
注意:2的补码中的-128
是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
,打印所需的-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