【发布时间】:2013-08-02 09:38:42
【问题描述】:
有些东西我不明白:
C 中的signed char 用 8 位表示:00000000
- 0 是
0000 0000=> 0 - 1 是
0000 0001=> 1 - ...
- 127 是
0111 1111=> 127
所以我认为第 8 位是符号位。 所以我想:
- 128 是
1000 0000=> 0 - 129 是
1000 0001=> -1
但是没有!
试试这个:
int main(int argc, const char *argv[])
{
int i;
for (i = 0; i < 256; i++) {
printf("%3d = %d\n", i, (signed char)i);
}
return 0;
}
你会得到:gcc -o tt tt.c ; ./tt | more
- ...
126 = 126127 = 127128 = -128129 = -127130 = -126254 = -2255 = -1
怎么来的?
【问题讨论】:
-
您描述的符号幅度方案确实存在,但整数很少见,因为它使算术复杂化。二进制补码使许多操作与符号无关。
-
@GrijeshChauhan 显着未定义,如果您将自己限制为 8 位(这不是一个可表达的数字,但如果您盲目地应用如何使用 2-补码来否定数字的规则,您最终会得到 - (-128) -> -128.
-
@Vatine 你是正确的位溢出是未定义的,它实际上是实现定义的,因为一个陷阱表示。我只是试图回答特定的输出。