【发布时间】:2020-05-14 18:30:36
【问题描述】:
什么是 char 隐式类型转换规则?以下代码给出了 -172 的尴尬输出。
char x = 200;
char y = 140;
printf("%d", x+y);
我的猜测是,被签名后,x 被转换为 72,y 被转换为 12,这应该给出 84 作为答案,但上面提到的情况并非如此。我在 Ubuntu 上使用 gcc。
【问题讨论】:
什么是 char 隐式类型转换规则?以下代码给出了 -172 的尴尬输出。
char x = 200;
char y = 140;
printf("%d", x+y);
我的猜测是,被签名后,x 被转换为 72,y 被转换为 12,这应该给出 84 作为答案,但上面提到的情况并非如此。我在 Ubuntu 上使用 gcc。
【问题讨论】:
以下代码给出了 -172 的尴尬输出。
溢出的行为取决于实现,但显然在您的情况下(和我的情况)char 有 8 位,它的表示是 2 的补码。所以unsigned char 200 和 140 的二进制表示是11001000 和 10001100,对应于 signed char -56 和 -116 的二进制表示,-56 + -116 等于 -172(char 被提升为 int 以进行加法)。
强制 x 和 y 为 signed 的示例,无论 char 的默认值如何:
#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 $
我的猜测是被签名后,x 被转换成 72,y 被转换成 12
您认为高位已被删除(11001000 -> 1001000 和 10001100 -> 1100),但事实并非如此,这与 IEEE 浮点数使用位作为符号相反。
【讨论】:
char 的转换中的溢出是实现定义的,而在 x+y 中,添加发生在 @987654335 之间@操作数根据cigix.me/c17#6.3.1.1.p2