输出是 128 的 32 位 2 的补码,即 4294967168。怎么样?
#include <stdio.h>
int main()
{
char a;
a=128;
if(a==-128)
{
printf("%u\n",a);
}
return 0;
}
在打开警告的情况下编译代码会给出:
warning: overflow in conversion from 'int' to 'char' changes value from '128' to '-128' [-Woverflow]
这告诉你作业a=128;
您的平台上没有明确定义。
标准说:
6.3.1.3 有符号和无符号整数
1 当一个整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则该值不变。
2 否则,如果新类型是无符号的,则通过在新类型可以表示的最大值上重复加或减 1 来转换该值,直到该值在新类型的范围内。
3 否则,新类型是有符号的,并且值不能在其中表示;结果要么是实现定义的,要么引发实现定义的信号.
所以我们无法知道发生了什么,因为这取决于您的系统。
然而,如果我们做一些猜测(并注意这只是一个猜测):
128 作为 8 位将是 0b1000.0000
所以当你打电话时printf
您可以在哪里转换为int
将会有一个符号扩展,例如:
0b1000.0000 ==> 0b1111.1111.1111.1111.1111.1111.1000.0000
其中 - 打印为无符号表示数字 4294967168
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)