在c中添加char值

时间:2017-03-16 15:39:40

标签: c

#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?

提前致谢。

4 个答案:

答案 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类型(127118

如果您在程序员模式下打开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>