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 将要 签署 不管 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浮点数用位作标志相反。