char c=130;printf ("%d",c);这个得出的结果为什么是-126啊?

来源:百度知道 编辑:UC知道 时间:2024/05/14 14:07:38

这是由于字符和整型是兼容的。计算所有的符号,都是按以0~255对应的ASCII码存储的。首先,我们来看看c=130,在内存中是如何存在的:
130换算成二进制串是"1000 0010"。(你应该知道计算机存储数据是以补码存储的,正数的补码,就是它本身,即最高位是0.而负数的补码是以正数的二进制码取反加1【除最高位外】,如-1的补码是这样来求的:
先看正数1的二进制编码:0000 0001,除最高位1不动外,其它位取反加1.
所以是1000 0001取反:1111 1110,再加1得:1111 1111,所以-1的补码是"11111111",即计算机要存储-1的话,在内存中的存储就是“1111 1111”,

知道了这一个,我们再来看看求-126的补码:126的二进制编码是"0111 1110",所以-126的补码是先求反码再+1,注意(负数的最高位肯定是1),由上所讲解的方法。-126的补码是"1000 0010",你会发觉这和130的的编码是一样的。关键就在于你用了%d打印。"%d",打印的时候,因为你是8位的,明显应该是short int,编译器自动解释成"hd",注意,最高位是1,所以它被解释成了-126.

by:kingbridge

你定义的C是字符型。后面输出的又是整型

输出格式不对
char型用%c
int型才用%d

补码谢谢!