正数的补码是原码,负数的补码是反码加一。正数的反码是原码,负数的反码是原码符号位不变,其它位反转。
以下实验环境为VS2010
unsigned int a = -10;
printf("0x%x", ~a);
输出:0x9
解释:当给无符号型a赋负值时,a自动变为有符号数,a在机器中的存在形式为0x80 00 00 0a的补码形式,即0xff ff ff f6。按位取反(包括符号位)变为0x00 00 00 09。
unsigned int b = -10;
printf("0x%x", b);//显示补码
输出:0xff ff ff f6
char c = -127;
printf("0x%x", c);
输出:0xff ff ff 81
解释:虽然是char型,但在32为系统中还是按照32位数据进行处理的,即-127的原码为0x80 00 00 7f,反码为0xff ff ff 80,补码为0xff ff ff 81。
char d = -128;
printf("0x%x", d);
输出:0xff ff ff 80
解释:int型-128的原码0x80 00 00 80,反码0xff ff ff 7f,补码0xff ff ff 80,与char型相同。
综上:计算机以补码的形式进行存储显示。可以将char型完全当成int型。