我的小程序:
#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