1,原码变成反码是取反(除符号为外,将原来的0或1变为1或0),反码变为补码是加1
例如
10000011000000000011000000000011 原码
11111100111111111100111111111100 反码
11111100111111111100111111111101 补码
2,面对无符号类型,%d与%u
例1:
当使用%u打印无符号的c时,c看为正数,最高位不是符号,当做有效数字
虽然打印的都是变量的c,但当时用%d时,会将c看作有符号的c,即最高位是符号位,认为是负数,所以此时的补码不是原码,要将其转化为原码,在打印出来,结果会为-10
int main()
{
int a = -20;
//10000000000000000000000000010100 原码
//11111111111111111111111111101011 反码
//11111111111111111111111111101100 补码
unsigned int b = 10;
//00000000000000000000000000001010 原码 补码
unsigned int c = a + b;
//11111111111111111111111111101100 a
//00000000000000000000000000001010 b
//11111111111111111111111111110110 a+b
//11111111111111111111111111110110 c
printf("%d\n", c); //结果为-10
printf("%u\n", c); //结果为4294967286
return 0;
}
例题2
int main()
{
int a = -1;
//10000000000000000000000000000001
//11111111111111111111111111111110
//11111111111111111111111111111111
unsigned short b = a;
//1111111111111111 b的原反补
printf("%d\n", b);
//00000000000000000111111111111111 整形提升,因为b是无符号短整型类型的,所以补0
printf("%u\n", b);
//00000000000000000111111111111111 整形提升,因为b是无符号短整型类型的,所以补0
return 0;
这里的b最高位都是0,所以用%d时会把他看成正数,所以用%d与%u打印出来的结果都一样