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 做加法)。

强制 xysigned 的示例,无论 [=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 浮点数使用位作为符号相反。