整数表示
- 主要内容:展示整数的两种不同表现形式,研究扩展或者收缩一个已编码整数以适应不同长度表示的效果
- 术语详见教材
B:二进制
2:to
U:无符号数
T:补码
w:位数
整型数据类型
- 为各种不同的数据类型分配的字节数与32位或64位编译法有关
- 根据字节分配,不同大小能表示的值的范围是不同的
- 很值得注意的特点:有符号类型的范围,负数总是比整数大一。注意,必须考虑这一点,很可能会在程序中造成错误
无符号数的编码
- 使用位向量表示整个整数数据类型。将其视作二进制表示的数,就获得了无符号表示的数据(B2U映射)
- 无符号数的二进制表示有一个很重要的属性:每个介于0~2^w-1之间的数有一个唯一的w位的值编码 <=> B2U是一个双射 <=> B2U <-> U2B
补码编码
-
最常见的有符号数的计算机表示方法:补码形式
-
补码的最高位称之为负权
B2T = -x(w-1)2^(w-1) + B2U(w-1) -
同无符号数编码一样,B2T也是一个双射:对于每个数x,满足TMinw <= x <= TMaxw,则T2Bw(x)是x唯一的w位模式
-
值得注意的地方:
- 补码的范围是不对称的(再次强调)这将导致补码运算的特殊属性与一些细微的错误
- 无符号整数的最大值刚刚好比补码的最大值的两倍多一点, U M a x = 2 T M a x + 1 UMax = 2TMax + 1 UMax=2TMax+1,且 -1与UMax有相同的位表示
-
C文件中的limits.h中定义了一组常量。限制了编译器对不同整形数据的取值范围
-
对于某些程序来说,用某个确定大小的表示来编码数据类型非常重要
-
例如,与网络协议有关的程序,需要使得数据类型与协议指定的数据类型兼容
-
C语言确定的只是每种数据类型的最小范围,而非确定范围
-
有符号数的其它表示方法:反码、原码
反码:最高位是-(2^(w-1) - 1)而非-(2^(w-1)),其它与补码一致
源码:最高有效位是符号位,其它用来确定正负值 -
这两种表示方法都有奇怪的属性:对数字0有两种不同的编码方式,出现了+0与-0
-
反汇编器:一种将可执行程序文件转换为ASCII码形式的出现
-
这些文件包含许多16进制的数字,使用典型的补码形式来表现这些值
有符号数和无符号数之间的转换
- 强制类型转换的结果保持位值不变,只改变了解释方式
- 对于大多数C语言,处理同等字长的有符号数与无符号数,数值可能会变,但是位模式不会变
T