整数在内存中都是以补码形式存储的,以下面这份代码为例做个实验。

#include <stdio.h>

int main(int argc, char *argv[])
{
    unsigned char buf[1] = {0x81};

    printf("value = %d\n", (char)buf[0]);

    return 0;
}
liyongjun@Box:~/project/my/c/study$ ./整数在内存中的存储都是补码.out 
value = -127

buf 为一字节的内存,里面存储的二进制为 1000 0001,我们当它是补码,看能不能算出实际值是 -127,如果是,那整数在内存中就是以补码的形式存储的。

1000 0001 最高位为 1 ,表示数据是负数。补码转反码,最高位符号位不变,剩余部分减去数值 1 ,得到反码为 1000 0000 。反码转原码,最高位符号位不表,其余位按位取反,得到原码为 1111 1111 。此原码的值正是 -127 ,由此可以初步证明,整数在内存中是以补码形式存储的。