前言:
1.整数在内存中以二进制补码的形式存放
2.打印时打印的是原码
3.整形提升:当数据类型为char、signed char、unsigned char、short、signed short、unsigened short时,它们在内存所占中的数据类型长度<4字节,在进行计算或打印时,会发生整形提升,即前面补符号位
(1)正整数发生整形提升时,前面会补0
(2)负整数发生整形提升时,前面会补1
举例如下:
char a = -1;
//10000000 00000000 00000000 00000001 原码
//11111111 11111111 11111111 11111110 反码(取反)
//11111111 11111111 11111111 11111111 补码(+1)
//char类型截断,取一个字节
//11111111
//打印:整形提升(因为是负数,所以前面补1)后是补码,再求原码(-1,取反)
//11111111 11111111 11111111 11111111补码
//11111111 11111111 11111111 11111110反码(-1)
//10000000 00000000 00000000 00000001原码(取反)
//-1
signed char b = -1;
//有符号数,同a
//-1
unsigned char c = -1;
//10000000 00000000 00000000 00000001原码
//01111111 11111111 11111111 11111110反码(取反)
//01111111 11111111 11111111 11111111补码(+1)
//char类型截断,取一个字节
//11111111
//打印:整形提升(因为是无符号数,所以前面补0)后是补码,再求原码(原码同补码)
//00000000 00000000 00000000 11111111补码
//原码同补码
//255
printf(" a = %d,b = %d,c =%d", a, b, c);
//a = -1 b = -1 c = 255