#include<stdio.h>
int main()
{
char c =118,a=117;
c=c+10;
a=a+10;
printf("c:%d, a:%d\n", c,a);
}
答案是c:-128,a:127。
有人可以解释一下为什么c + 10是-128而a + 10是127?
提前致谢。
答案 0 :(得分:2)
有符号的8位值范围从-128到127. 127的位是0111 1111,128的位是1000 0000.问题是,在有符号数字中,高位(最左边)位是符号标志(0为+,1为 - )。因此,因为它是有符号的,所以计算机将其解释为负数,结果为-128(这被称为有符号溢出,如果我没记错的话,每个人在一点或另一点编程时会遇到这种情况)(查看2的补码)看看为什么低7位是128,而不是0)。您可以通过将c和a声明为unsigned char
而不是char
来解决此“问题”。
char a=117;
printf("c:%d, a:%d\n", a+11,a+10);
答案 1 :(得分:2)
char
,其范围为-128
类型(127
至118
)
如果您在程序员模式下打开Windows计算器,则可以看到1110110
以二进制形式表示为10
。另外,1010
表示为10000000
。如果我们添加这两个,结果是-128
。它不在char类型的范围内,这个数字相当于-128
。所以打印Order.states.key(100) => 'cancelled'
。
答案 2 :(得分:1)
因为char
在编译器中是8位签名的。因此118+10
超出范围(最大值为127
)。
编译器的实现&#34;包装&#34;它周围,而你得到-128
。
答案 3 :(得分:1)
在您的情况下,您的特定平台上的编译器将char
表示为签名的8位值,并且位于2's complement reoresentation中。这意味着最高位是符号位(如果它是1,则数字为负)。因此,非负值的二进制范围是(二进制)00000000-01111111,十进制为0-127。负值范围(二进制)从10000000到11111111,十进制为-128到-1。
如果从118开始,则使用二进制文件:
01110110
如果我添加十进制10,那就是在二进制中添加1010:
01110110
+00001010
---------
10000000
您现在可以看到设置的最高位,意味着数字溢出(变得大于十进制的最大值127),现在表示负数。 8位二进制值10000000恰好代表十进制的-128。
因此,将(以十进制表示)10添加到char
值118,产生-128。
a
的值为117,因此10 + 117 = 127仍然适合7位,正值为127.您可以将上述二进制分析作为练习,看看它是如何工作的。< / p>