C 解释变量b的值为-116
所以我遇到了这个片段,在阅读了一些关于char和int计算的内容后,我理解了计算是用int进行的,这里它被打印成一个。我不明白的是变量b如何在内部假定值为-116。有人能解释一下数学吗? 注意:这只在有符号字符域中-128到127C 解释变量b的值为-116,c,oop,C,Oop,所以我遇到了这个片段,在阅读了一些关于char和int计算的内容后,我理解了计算是用int进行的,这里它被打印成一个。我不明白的是变量b如何在内部假定值为-116。有人能解释一下数学吗? 注意:这只在有符号字符域中-128到127 int main() { char a=120,b=140; int i; i=a+b; printf("%d",i); } ans=4,在编译器中为a=120和b=-116。140=0x8C,当设
int main()
{
char a=120,b=140;
int i;
i=a+b;
printf("%d",i);
}
ans=4,在编译器中为a=120和b=-116。140=0x8C,当设置最高位时,如果解释为有符号值,则为负值。因此,它将以十进制表示法打印为-116。因为
b
不能存储140
(因为它是有符号的),编译器将把值(以实现定义的方式)转换为适合有符号字符范围的其他值
在您的例子中,它使用原始位并将它们复制到b
,这对于有符号字符来说意味着b
等于-116
(In)
因此a+b
将等于120+-116
,即4
还需要知道的是,当您在算术表达式中使用小于int
的类型的值(如代码中的a+b
)时,这些值会发生变化,从而导致它们被忽略
升级到int
将保留该符号(它不进行符号扩展)。因此,signed char
值-116
将成为signed int
值-116
,char
在编译器上默认是有符号的,长度为8位,使用2的补码。这意味着140
的位模式具有数值-116
。您已经提到过它:“仅带符号字符-128到127”。计算只在以后的另一条指令中进行。初始化b
时,需要将值放入char
,而不是int
116是140的2个补码,因为116+140=256等于2^8,char中的位数r。两个补码是所有现代机器上使用的负数的通用编码。我现在看到,我找不到这个2的补码逻辑,谢谢各位,为了更清楚,我将进一步研究它。您正在将int
类型的值转换为char
,而这个值不能在char
中表示。因此,根据C标准,如果char
被签名,则结果是实现定义的。在这种情况下,如上所述,选择使用2的补码解释的实现。