前言:
1.整数在内存中以二进制补码的形式存放
2.打印时打印的是原码
3.整形提升:当数据类型为char、signed char、unsigned char、short、signed short、unsigened short时,它们在内存所占中的数据类型长度<4字节,在进行计算或打印时,会发生整形提升,即前面补符号位
(1)正整数发生整形提升时,前面会补0
(2)负整数发生整形提升时,前面会补1
举例如下:
1. char a = -1; 2. //10000000 00000000 00000000 00000001 原码 3. //11111111 11111111 11111111 11111110 反码(取反) 4. //11111111 11111111 11111111 11111111 补码(+1) 5. //char类型截断,取一个字节 6. //11111111 7. //打印:整形提升(因为是负数,所以前面补1)后是补码,再求原码(-1,取反) 8. //11111111 11111111 11111111 11111111补码 9. //11111111 11111111 11111111 11111110反码(-1) 10. //10000000 00000000 00000000 00000001原码(取反) 11. //-1 12. 13. 14. signed char b = -1; 15. //有符号数,同a 16. //-1 17. 18. 19. unsigned char c = -1; 20. //10000000 00000000 00000000 00000001原码 21. //01111111 11111111 11111111 11111110反码(取反) 22. //01111111 11111111 11111111 11111111补码(+1) 23. //char类型截断,取一个字节 24. //11111111 25. //打印:整形提升(因为是无符号数,所以前面补0)后是补码,再求原码(原码同补码) 26. //00000000 00000000 00000000 11111111补码 27. //原码同补码 28. //255 29. 30. printf(" a = %d,b = %d,c =%d", a, b, c); 31. //a = -1 b = -1 c = 255