编码整数有2种方式: 一种只能表示非负数(大于0的数) 另一种能够表示负数、零和正数.
C和C++都支持有符号(默认)和无符号数 Java只支持有符号数.
无符号数的二进制表示又一个很重要的属性:
最常见的 有符号数 的计算机表示方式就是 补码(two's-complement) 形式: 字的最高有效位当作负权(negative weight) 也就是符号位.
与无符号表示一样 在可表示的取值范围内的每个数字都由一个唯一的w位的补码编码 —— 补码编码的唯一性.
—— 还有一个注意点: 补码的-1和无符号的最大值UMax有同样的位表示 —— 一个全1的穿 而数值0在两种表示中都是全0的串.
C语言标准并没有要求要用补码形式来表示有符号整数 但是几乎所有的机器都是这么做的.
所以为了程序的可移植性 开发人员不要手动更改数值的表示范围 也不要假设有符号数会使用其他特殊的表示方式.
扩展: 反汇编器是一种将可执行程序文件转换回可读性更好的ASCII码形式的程序. 这些文件包含许多十六进制的数字 都是用典型的补码形式来表示这些值.
能够认识反汇编器生成的数字并理解它们的意义 是一项重要的技巧.
(4) 有符号数和无符号数之间的转换:
C语言允许在各种不同的数字数据类型之间做强制类型转换.
对大多数C语言的实现 处理同样字长的有符号数和无符号数之间相互转换的一般规则: 数值可能会改变 低层存储数值的位模式不会变.
C语言中 当用printf输出数值时 分别用指示符%对、%u和%x表示用有符号十进制、无符号十进制和十六进制格式输出一个数字.
