gcc中的字符转换

问题描述 投票:0回答:1

char隐式类型化规则是什么?下面的代码给出了一个尴尬的输出-172。

char x = 200;
char y = 140;
printf("%d", x+y);

我的猜测是,由于是有符号的,x被转成了72,y被转成了12,所以答案应该是84,但事实并非如此。我在Ubuntu上使用gcc。

gcc casting char int
1个回答
2
投票

下面的代码给出了一个尴尬的输出-172。

溢出的行为取决于实现,但在你的情况下(和我的情况下),明显的是一个 char 有8位,它的表示方式是2的补数,所以二进制表示方式是 unsigned char 200和140分别为11001000和10001100,对应于二进制表示的。 signed char -56和-116,以及 -56 + -116 等于-172 char 晋升为 int 做加法)。)

强制示例 xy 将要 签署 不管 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-&gt;1001000和10001100-&gt;1100),但事实并非如此,与IEEE浮点数用位作标志相反。

© www.soinside.com 2019 - 2024. All rights reserved.