我的小程序:
#include <stdio.h>
int main() {
signed char c = -128;
c = -c;
printf("%d", c);
return 0;
}
打印:
-128
减号 (-) 运算符是否可跨 CPU 移植?
我的小程序:
#include <stdio.h>
int main() {
signed char c = -128;
c = -c;
printf("%d", c);
return 0;
}
打印:
-128
减号 (-) 运算符是否可跨 CPU 移植?
一元减号的操作数首先经过标准的承诺,所以它是类型int
,可以表示值-128
。操作的结果是值128
,也是类型int
。int
从to的转换signed char
是有符号类型的缩小范围,是实现定义的。
(您的实现似乎做了一个简单的环绕:125、126、127、-128、-127,...)
注意:-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
, 打印所需的 -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
因为一个 byte(char) 不能容纳 128
-128 = 0x80
neg 做的是反转它并加 1
-(-128) = (~0x80) + 1 = 0x7F + 1 = 0x80
达哈,你又得到了 0x80