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,而


发布评论