一、整数数据类型
1、C语言整数类型包括char、short、int、long、int32_t、uint32_t、int64_t、uint64_t,以及unsigned表示非负。long在32位机器占4个字节,在64位占8个字节。
2、C和C++都支持有符号和无符号数,Java只支持有符号数。
二、无符号数的编码
1、如果一个无符号数占w位,则这个无符号数的取值范围是从0到2的w次方-1。
2、无符号数编码的唯一性:每个介于0到2的w次方-1的数都有唯一一个w位的值编码。
3、B2U表示从二进制转为无符号数,U2B表示从无符号数转为二进制,B2U是一个双摄。
三、编码补码
1、最常见的有符号数的计算机表示方式就是补码。
2、最高有效位成为符号位,为1时表示负数。
3、补码的表示范围从负的2的W-1次方到2的W-1次方减1。
4、补码也具有唯一性。
5、C语言标准没有要求用补码形式表示有符号数,但是几乎所有机器都是这么做的,所以遵循补码表示的整数范围可以保证程序最大的可移植性。
四、有符号数和无符号数之间的转换
1、如果u表示无符号数、i表示有符号数,(int)u会把u强制转换为有符号数,(unsigned)i会把i强制转换为无符号数。强制转换类型的结果位值不变,只是改变了解释这些位的方式。
2、补码转无符号数:
3、无符号数转补码:
五、C语言的有符号数和无符号数
1、一般声明的数字都是有符号的,要声明无符号数要加上后缀U或u,例如12345U。
2、t = (int)u强制显示转换;t = u隐式转换。
3、printf可以用u%输出有符号数,也可以用d%输出无符号数。
4、当执行一个运算包括有符号和无符号数时,C语言将有符号数转换为无符号数。这会导致一些问题,例如-1 < 0U会转换为429296...U < 0U,结果会是false。
六、扩展一个数字的位表示
1、将小类型转换为大类型,根据有符号和无符号有两种转换。
2、无符号数的零扩展:
3、补码数的符号扩展:
4、当把short转换为unsigned时,先改变大小,再完成从有符号到无符号的转换。
七、截断数字
1、截断无符号数:
2、截断有符号数:
八、关于有符号和无符号数的建议
1、把字当做数字时,绝不使用无符号数,能够避免隐式类型转换的一些bug。
2、如果把字当做位的集合,无符号数时很有用的。