gcc 中的字符转换
Char conversion in gcc
char隐式类型转换规则是什么?下面的代码给出了一个笨拙的输出 -172.
char x = 200;
char y = 140;
printf("%d", x+y);
我的猜测是签名时,x被转换为72,y被转换为12,应该得到84作为答案,但是不是上面提到的情况。我在 Ubuntu.
上使用 gcc
The following code gives an awkward output of -172.
溢出的行为取决于实现,但在你的情况下(和我的)显然 char
有 8 位,它的表示是 2 的补码。所以 [=13 的二进制表示=]200和140分别是11001000和10001100,对应的二进制表示是signed char
-56和-116,而-56 + -116
等于-172(把char
提升为int
做加法)。
强制 x 和 y 为 signed 的示例,无论 [=12 的默认值如何=]:
#include <stdio.h>
int main()
{
signed char x = 200;
signed char y = 140;
printf("%d %d %d\n", x, y, x+y);
return 0;
}
编译与执行:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
-56 -116 -172
pi@raspberrypi:/tmp $
My guess is that being signed, x is casted into 72, and y is casted into 12
您假设较高的位已被删除(11001000 -> 1001000 和 10001100 -> 1100),但事实并非如此,这与 IEEE 浮点数使用位作为符号相反。
char隐式类型转换规则是什么?下面的代码给出了一个笨拙的输出 -172.
char x = 200;
char y = 140;
printf("%d", x+y);
我的猜测是签名时,x被转换为72,y被转换为12,应该得到84作为答案,但是不是上面提到的情况。我在 Ubuntu.
上使用 gccThe following code gives an awkward output of -172.
溢出的行为取决于实现,但在你的情况下(和我的)显然 char
有 8 位,它的表示是 2 的补码。所以 [=13 的二进制表示=]200和140分别是11001000和10001100,对应的二进制表示是signed char
-56和-116,而-56 + -116
等于-172(把char
提升为int
做加法)。
强制 x 和 y 为 signed 的示例,无论 [=12 的默认值如何=]:
#include <stdio.h>
int main()
{
signed char x = 200;
signed char y = 140;
printf("%d %d %d\n", x, y, x+y);
return 0;
}
编译与执行:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
-56 -116 -172
pi@raspberrypi:/tmp $
My guess is that being signed, x is casted into 72, and y is casted into 12
您假设较高的位已被删除(11001000 -> 1001000 和 10001100 -> 1100),但事实并非如此,这与 IEEE 浮点数使用位作为符号相反。