添加两个字符并将结果分配给 C 中的 int

Dan*_*Dan 5 c

int main(){

 char a = -5;
 char b = -6;
 int c = a+b;
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在不同的体系结构中得到了不同的结果,使用gcc.

x86变量c进行了正确的符号扩展,我得到-11.

在其他一些架构c上没有符号扩展,你得到a+b位转换为 an的结果,int我得到501.

这是未定义的行为吗?

Car*_*rum 8

char有时是无符号类型。使用signed char或者unsigned char如果您需要明确说明它。将打印添加到您的程序并在这两种情况下编译显示您的行为:

$ make example && ./example
cc     example.c   -o example
-11
Run Code Online (Sandbox Code Playgroud)

对比:

$ CFLAGS=-funsigned-char make example && ./example
cc -funsigned-char    example.c   -o example
501
Run Code Online (Sandbox Code Playgroud)