输出是32位2的128补码,即4294967168.如何?
#include <stdio.h>
int main()
{
char a;
a=128;
if(a==-128)
{
printf("%u\n",a);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在打开警告的情况下编译代码可以:
warning: overflow in conversion from 'int' to 'char' changes value from '128' to '-128' [-Woverflow]
Run Code Online (Sandbox Code Playgroud)
它告诉你,a=128;你的平台上的作业没有明确定义.
标准说:
6.3.1.3有符号和无符号整数
1当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变.
2否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.
3否则,新类型已签名且值无法在其中表示; 结果是实现定义或实现定义信号被引发.
因此,我们无法知道发生了什么,因为它取决于您的系统.
但是,如果我们做一些猜测(并注意这只是猜测):
128为8位将为0b1000.0000
因此,当您致电printf转换到的int地方时,会有一个符号扩展名,例如:
0b1000.0000 ==> 0b1111.1111.1111.1111.1111.1111.1000.0000
Run Code Online (Sandbox Code Playgroud)
其中 - 打印为无符号代表编号4294967168