对原码反码补码和ASCII码的关系做出的试探性讨论

人们一开始想用计算机来存储数据(不妨先理解为自然数),1,2,39,48之类的数据。但是计算机只是一个机器,无法理解这些数的概念。只能区分1和0(这正好对应了真与假,做与不做,开与闭……二元比多元更容易让机器理解)那么人们就把这两个数作为基数,模仿十进制,创造了二进制,比如65对应了1000001。人们就把二进制存储在机器中。

后来人们想把现实世界的十进制的加减搬到计算机世界,或者换句话说,用计算机里的二进制来表示现实世界的十进制。出于计算规范和引入负数的考虑,人们规定二进制要八位,不足的用0补齐,并规定用最高位的0和1来表示正负(因为计算机同样不能理解“+”“-”,只能区分1和0)这就是最早的机器码,即后来所讲的原码。

原码诞生后,人们打算用其来计算。但后来发现带符号位的原码计算出现了问题

现实中十进制1-1运算结果应该为0,即:( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10

可在计算机中(00000001)原 +(10000001)原 = (10000010)原 = (-2 ) 显然不正确.

因为正数间的加法运算是没有问题的,问题应该是由负数导致的,所以,为了能够使计算机中的运算得到正确结果。人们于是做了调整,将负数的原码除符号位外的数按位取反。0变为1,1变为0. 而正数的原码不变。用新得到的二进制数来表示现实世界的十进制数。(相当于重新规定了一套数,用其来表示现实世界的十进制数。这样的规定是完全合理可行的,因为计算机里的数本来就是一串没有实际意义的“0”和“1”的集合(这里0和1用的是引号,因为计算机甚至连0和1都不理解,这里的0和1只是单纯的电位高低而已),用来表示现实世界的数,本来就是人为意志。人们想怎么规定就怎么规定。只要能自圆其说,能用就行。)我们把这套新规定的数叫反码,它表示的值和原码一样。比如(10000010)原和(11111101)反 虽然形式不同(正好对应了计算机内部不同的电位高低组合),但人们就是把它们都赋予了相同的意义:十进制数2

由于反码实际上也是计算机内部的“数”(计算机内部的电位高低组合),所以它也算机器码

这样计算似乎就正确了许多,比如

( 1 )10 - ( 2)10= ( 1 )10 + ( -2 )10 = ( -1 )10

(00000001) 反+ (11111101)反 =(11111110)反 = ( -1 ) 正确 注意:计算时一定要统一好规定,反码只能跟反码计算,结果也是反码。不过这样话我们怎么知道这套规定能自圆其说呢?因为这里我们本质上就是在做1-2的运算,那么只需要检验结果是不是3就可以了。由于我们先前在规定反码的时候,实际上也明确了反码和原码的函数关系。于是我们就可以把结果转化为原码,而由于比起反码,原码和十进制数的联系更直接自然(实际上我们当初引入反码,只是为了解决运算问题,但原码本身和十进制的对应关系是完全正确的,换句话说,不算符号位的原码,即后七位二进制数本来就是现实世界的数,是十进制数的另一种写法罢了)我们就可以将原码转化为自然数,即-1。结果显然正确。

但是人们后来又发现反码又要处理符号位进位问题,过于麻烦

所以就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的。这样符号位进位就可以舍去了。不过补码仍然存在着-0这个十进制不存在的数。怎么解决呢?后来人们发现,-127对应的原码是11111111那么其补码就是10000001而10000001-1刚好就是10000000,即“-0”对应的补码,而10000001-1如果用十进制数来解释刚好就-127-1,即-128。于是人们就把10000000规定为-128的补码,人们发现这个规定还挺巧的,比如-128如果假想一个符号位原码可以表示为(1)10000000,这样按位取反得到了(1)01111111,再加个1刚好就是(1)10000000。于是10000000顺理成章就成了-128的补码了,这样不仅解决了-0的问题,还扩大了补码的有效表示范围。

.所以补码的表示范围为: (-128~0~127)共256个.

不过注意:(-128)没有相对应的原码和反码,(因为我们实际上不能假想一个符号位)

和反码一样,补码实际上也可以用计算机内部的电位高低组合来表示,所以补码也算机器码。

而这三种机器码本质上都被规定表示同一个值。即现实的十进制数,或者说真值。这样十进制整数以及它们的运算法则都被移到了计算机世界了。人们于是就把目标转向各种字符。为了表示这些字符,人们用ASCII码来编号。而这里的ASCII码本质上更起源于真值,事实上这也很容易想,我们正是1,2,3,4,5……这样给字符编号的。所以ASCII码一开始也是7位二进制数。只不过在电脑中是前面加了0组成八位罢了。但注意在计算机最底层,这些数字还是用补码来存储,(计算机的电位高低组合人们用补码那套规定来和数字一一对应,换句话说,当我们想要知道屏幕上某个字符对应的计算机内部电位高低组合,我们需要用补码那套对应关系才能知道正确答案)

只不过ASCII码对应的原码被规定第一位是0,其补码和原码一样,所以没什么影响。

此外值得提醒的是,所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值