c语言解释,涉及整数计算

  • 本文关键字:整数 计算 语言 解释 c
  • 更新时间 :
  • 英文 :


我有以下代码,

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
带符号charsigned char具有相同的范围、大小和编码,但却是一种不同的类型。


这是整数求反或溢出的例子吗?

两者都没有。这是实现定义的转换的一个示例。这是一个非常常见的问题。

转换。。。。否则,将对新类型进行签名,并且无法在其中表示值;要么结果是实现定义的,要么产生实现定义的信号。C17dr§6.3.1.3 3


1概念上使用2的补码编码,int255或0000…0000_1111_11112的最低有效字节模式保留为有符号char,其中前导位是符号(或-128位(。

最新更新