我有以下代码,
void main(void) {
char x = 1 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 - 1;
printf("%d", x);
}
我得到结果-1
然而,1 * 2 * 2 * 2 * 2 * 2 * 2 * 2
已经得到-128
。你能解释一下为什么我能成功地运行上面的代码并得到结果-1
吗?
另外,这是整数求反还是溢出的例子?
1 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2
是乘积为256的int
数学。1 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 - 1
是255。
所以代码就像
char x = 255;
printf("%d", x);
如果char
是范围为0…255的无符号char
,则输出为
255
如果一个char
是一个范围为-128…127的符号char
,则赋值将以实现定义的方式将255转换为char
,很可能是一个值为-1的环绕1(或255-256(。输出为
-1
char
实现为无符号char
或有符号char
在OP的情况下,它是一个签名的char
带符号char
与signed char
具有相同的范围、大小和编码,但却是一种不同的类型。
这是整数求反或溢出的例子吗?
两者都没有。这是实现定义的转换的一个示例。这是一个非常常见的问题。
转换。。。。否则,将对新类型进行签名,并且无法在其中表示值;要么结果是实现定义的,要么产生实现定义的信号。C17dr§6.3.1.3 3
1概念上使用2的补码编码,int
255或0000…0000_1111_11112的最低有效字节模式保留为有符号char
,其中前导位是符号(或-128位(。