Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 解释变量b的值为-116_C_Oop - Fatal编程技术网

C 解释变量b的值为-116

C 解释变量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,当设

所以我遇到了这个片段,在阅读了一些关于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,当设置最高位时,如果解释为有符号值,则为负值。因此,它将以十进制表示法打印为-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的补码解释的实现。