| Ye-Jun's profileGuo's 点点滴滴Blog | Help |
|
May 18 有符号整数的计算机表示在学校时上过好几门课程里面都有关于原码、反码和补码等的概念,当时虽然看明白了书上所写的,但总觉得还少了些什么。前段时间又看了一下,从函数映射的角度进行理解,为避免遗忘,记录于此。
一. 问题定义 同一问题存在多种表述方法。每一种方法都会先澄清问题本身并给出一些概念定义,然后在此基础上解决问题。
在现实世界中,有符号整数由两部分组成,符号和数字。符号可以是“+”(可以省略)或者“-”,数字可以用十进制、二进制、二十四进制等进制来表示。比如十进制的23、-12,二进制的+101、-100等等。
而在计算机内部,不存在和现实世界中的符号唯一对应的标记,所有数值(包括其符号)都要由0或者1来构成。 假设在计算机内部用8位来表示一个有符号整数,则其所有的可能取值为:从00000000到11111111,共256个。这256个取值到底代表着现实世界中的哪个整数,负数还是正数,取决于我们对有符号整数的计算机表示方法(比如用反码表示还是用补码表示)。 因此,计算机的内部表示中,无所谓存在符号的概念,所以,我们可以将这256个取值记为整数集合[0, 255]。
所以,原命题“有符号整数的计算机表示”就转换成了:从现实世界中某个范围的整数到集合[0 255]的映射。
如果你不喜欢用8来举例,可以使用更为一般化的N,只需要将本文中的256修改为2^N,将255修改为(2^N)-1,将128修改为2^(N-1)。
(如有转载,请全文无遗漏的转载,谢谢。)
二. 到集合[0 255]的映射 以下分别讨论原码、反码、补码等的映射 2.1 原码 定义域X1: [-127, 127] 值域Y1:[0, 255] 映射f1:这是一个分段函数 F1(x) = x 当 0<=x<=127 F1(x) = 128-x 当 -127<=x<=0 从严格意义上来说,这并不是一个函数,因为对x=0对应着两个y值。
2.2 反码 定义域X2: [-127, 127] 值域Y2:[0, 255] 映射f2:这是一个分段函数 F2(x) = x 当 0<=x<=127 F2(x) = 255+x 当 -127<=x<=0 从严格意义上来说,这并不是一个函数,因为对x=0对应着两个y值。
2.3 补码 定义域X3: [-128, 127] 值域Y3:[0, 255] 映射f3: f3(x) = x mod 256 (mod是求余操作,x mod y 是指x整除y得到的余数) 例:F3(127) = F3(127+0*256) = 127 F3(0) = F3(0+0*256) = 0 F3(-2) = F3(254+(-1)*256) = 254 F3(-128) = F3(128+(-1)*256) = 128 用分段函数表示为:
F3(x) = x 当 0<=x<=127
F3(x) = 256+x 当 -128<=x<0
2.4 IEEE float中指数(占8位)的偏移 (8 bit excess-127) 定义域X4: [-127, 128] 值域Y4:[0, 255] 映射f4:f4(x) = x + 127
试着在平面直角坐标系中画出上述四个函数。
三. 更多性质
3.1 补码的加减法一致性
假设有m、n属于[-128, 127],且m+n属于[-128,127],则有F(m)属于[0,255], F(n)属于[0 255]
则 F3(m+n) = (m+n) mod 256 = (m mod 256) + (n mod 256) + k*256 = F3(m) + F3(n) + k*256
当F3(m) + F3(n) < 256时,k = 0。
当F3(m) + F3(n) >= 256时,k=-1。在8位的计算机表示中,刚好可以用溢出来体现。
如果m+n不属于[-128,127],X86 CPU的标志寄存器会置上溢出标志。
如果F3(m)和F3(n)的最高位相同,而F3(m+n)的最高位不同,即结果溢出。
只有补码F3具有这样的性质。
3.2 某数的补码的补码是该数的原码
我们一般都是从“某数的补码是该数的原码取反加1”来理解这句话的。也就是说,“某数的补码”是从定义域X1到Y1再到Y3的两次映射的合映射,命题中第二个“的补码”则是从Y3到Y1的映射。本命题成立的本质原因是因为从Y1到Y3的映射和从Y3到Y1的映射都是“符号位不变,其他位取反加1”,而这实质上就是“部分位取反”(也是求补码快速方法的原因)。
个人认为,这其实是个残缺的命题。首先,原码和补码所对应的定义域X1和X3是不同的。其次,本命题本质上说的是两次取反加1的不变性,虽然补码的本质也是取反加1,虽然两者从具体操作上来说是相同的,但是,补码有其自己的意义,个人认为,本命题使用补码这个概念名词来表述是不妥当的。
四. 说明
本文并没有提出新的东西,只是试图从整体上将逻辑脉络梳理的清晰一点。
在其他资料可能会看到一些类似但又不完全相同的表述,因为正如开头所说的那样,同一问题存在多种表述方法。每一种方法都会先澄清问题本身并给出一些概念定义,在不同的前提定义下,需要仔细考虑是否存在可比性。
写于2008年5月
顺便补充和本文主旨无关的一个问题,已知补码求其原数(即从Y3到X3的映射)。其方法示例:
111110112 = −128+64+32+16+8+0+2+1 = ( − 27 + 26 + ...) = − 5
参考文献:
TrackbacksThe trackback URL for this entry is: http://unknown-error.spaces.live.com/blog/cns!9B12A9BDE11A3428!368.trak Weblogs that reference this entry
|
|
|