【发布时间】:2013-07-02 10:20:08
【问题描述】:
我的小程序:
#include <stdio.h>
int main() {
signed char c = -128;
c = -c;
printf("%d", c);
return 0;
}
打印:
-128
减号 (-) 运算符是否可跨 CPU 移植?
【问题讨论】:
标签: c cpu instruction-set
我的小程序:
#include <stdio.h>
int main() {
signed char c = -128;
c = -c;
printf("%d", c);
return 0;
}
打印:
-128
减号 (-) 运算符是否可跨 CPU 移植?
【问题讨论】:
标签: c cpu instruction-set
注意: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
【讨论】:
因为一个字节(char)不能容纳 128
-128 = 0x80
neg 做的是反转它并加 1
-(-128) = (~0x80) + 1 = 0x7F + 1 = 0x80
daha,你又得到了 0x80
【讨论】:
一元减号的操作数首先经过标准承诺,所以它是int类型,可以表示值-128。操作的结果是值128,也是int 类型。从int 到signed char 的转换是有符号类型的缩小,是实现定义的。
(您的实现似乎做了一个简单的环绕:125、126、127、-128、-127、...)
【讨论】:
int“更小”的东西都会被提升为int。然后将结果分配回左侧。
int的类型被提升为int,除非int不能代表原始类型的所有值,在这种情况下它们被提升为unsigned int.