2024年3月30日发(作者:)

128的补码

-128的补码2010-10-24 10:29-128的补码2010年10月23日星期六10:538位

定点整数的原码表示范围是-127到127 8位定点整数的补码表示范围是-128到127

对上两句说明:

用原码表示:

01111111 8位有符号最大的数是127 11111111 8位有符号最小的数是-127

用补码表示:

01111111 8位有符号最大的数是127 10000001 8位有符号最小的数是-127

但是还有一个更小的就是10000000把这个规定为-128的补码

在8位长度下,-128的原码与反码都不存在,因为一个字节的有符号数的原码范围

是:-127~+127,既然不存在-128的原码那么就无法求出-128的补码了,怎么办?

前几天听汇编老师曲俊华讲过,-128这样的数很特殊,不是取反加一求补码。

-2^n是个特殊数(n为x数值位的长度):它补码的求法应按照公式进行运算:

如:

-128

"[-2^7]补"=(2^8)+(-2^7)=10000000

原来还有更牛x的解释:一般的说法是负数的补码为其原码除符号位外取反然后总体

加一,也就是说,要得到一个负数数的补码,要先知道这个负数的原码才行。那么,问题

出现了,在8位长度下,-128的原码与反码都不存在,

127~+127,既然不存在-128的原码因为一个字节的有符号数的原码范围是:-

那么就无法求出-128的补码了,怎么办?

其实,这个问题的实际意义是,既然说计算机内部的有符号整数都是补码,那么怎么

才能有效的实现这一设计呢?潜台词是:根据上面由原码推导出补码的理论,如果是正数,

计算机得到其原码,也就是得到了其补码(正数补码等同于原码),如果是负数,先得到其

原码,然后再取反加一就可以了。也就是说按这个思维设计编译器,或计算机电路,就可

以了。但是如果出现开始说的-128的补码问题,这个设计就不能工作了。其实,在真正

的设计中,这种获得负数补码的"取反加一"的方案根本没有实施过~

拿现代的计算机举例,输入设备只有键盘,通过编辑器程序把键盘的扫描码变成

ascii码存储起来,比如输入'a'就存储0x61,输入'5'就存储0x35,这些都是ascii码。当

你想得到真正的机器数时(注意,机器数和ascii是不同的,字符'5'的ascii码是0x35,而