gcc中的字符转换

gcc中的字符转换,gcc,casting,char,int,Gcc,Casting,Char,Int,什么是字符隐式类型转换规则?下面的代码给出了一个笨拙的-172输出 char x = 200; char y = 140; printf("%d", x+y); 我的猜测是,在签名后,x被转换成72,y被转换成12,这应该给出84作为答案,但这不是上面提到的情况。我在Ubuntu上使用gcc 下面的代码给出了一个笨拙的-172输出 char x = 200; char y = 140; printf("%d", x+y); 溢出的行为取决于实现,但在您(和我)的情况下,char有8位,其表示

什么是字符隐式类型转换规则?下面的代码给出了一个笨拙的-172输出

char x = 200;
char y = 140;
printf("%d", x+y);
我的猜测是,在签名后,x被转换成72,y被转换成12,这应该给出84作为答案,但这不是上面提到的情况。我在Ubuntu上使用gcc

下面的代码给出了一个笨拙的-172输出

char x = 200;
char y = 140;
printf("%d", x+y);
溢出的行为取决于实现,但在您(和我)的情况下,
char
有8位,其表示形式是2的补码。因此,
无符号字符
200和140的二进制表示分别为11001000和10001100,对应于
有符号字符
-56和-116的二进制表示,
-56+-116
等于-172(将
字符
提升为
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;
}
我猜签名后,x被转换成72,y被转换成12


您假设删除了较高的位(11001000->1001000和10001100->1100),但事实并非如此,与IEEE浮点使用位作为符号相反。

在这种情况下没有未定义的行为,因为将200(resp 140)转换为
字符时的溢出是实现定义的,在
x+y
中,根据@PascalCuoq,加法发生在
int
操作数之间,我不是说加法,而是说将200和140赋给8位有符号字符的溢出。这一个是实现定义的,而不是如我所说的未定义的。“转换”和“要么结果是实现定义的,要么产生了实现定义的信号”在“是”中我用“未定义”说错了,我更正了,谢谢,我糟糕的英语^^