目录
https://blog.csdn.net/weixin_45792450/article/details/109314693
基本概念
有符号数与无符号数
计算机中,数的存放形式都是n位二进制数,为了区分正负性,往往把第一位空下来作为符号位,此种数就是有符号数。若在特定的应用中不需要负数,那么符号位自然就没有必要,此时二进制的每一位都是有效位,此种数就是无符号数。
通常对有符号数来说,0表示正,1表示负,第一位表示符号位,其余为数值位,二进制数=符号位+数值位。若采用3位二进制数表示数时,对无符号数101表示5,001表示1;对有符号数来说,101表示-1,,001表示+1。
定点数与浮点数
如果计算机中考虑小数表示的话,就需要确定小数点的问题,即小数点该如何表示。一般规定某一位之前为整数部分,之后为小数部分,由此解决小数点问题。
对n位二进制数,如果小数点位置固定不变,就称为定点数;如果小数点位置根据二进制内容浮动的,就称为浮点数。
各种码
计算机中,为了实现整数和小数的加减乘除,需要引入四种码:原码,反码,补码,移码,其中补码是运算的核心,运算原理的支撑是数学逻辑。
原码
原码表示法
对于原码,第一位为符号位,0表示正,1表示负,其余部分为数值位。对于小数,只考虑绝对值小于1的小数表示。对绝对值大于或等于1的小数,用整数+小数组合即可,后续会有更详细的IEEE标准介绍组合表示方法。
考虑采用n位无符号二进制数表示非负整数和非负小数:
如果在无符号数前面加上符号位,即可表示一定范围的小数和整数,这对于计算机的数值运算已经足够了,对于整数的范围和小数的精度,无非就是二进制数采用多少位的问题。
需要注意的是,0在原码中有两种表示方法,一种是符号位为1,数值位表示0;另外一种是符号位为0,数值位表示0,如000与100均表示0.
反码
反码的地位
反码通常是原码计算补码或者补码计算原码的过程中,用于中间过渡的码,其存在只是为了更方便理解和表达。
反码的计算
反码的符号位与原码一致,数值位进行如下变换:对于正数,数值位不变;对于负数,数值位按位取反。注意,此规则并没有区分是整数还是小数,两者规则是一致的。
补码
补码的意义
补码很重要,是计算机进行四则运算的基础,更是计算机中体现数学逻辑与设计巧妙的地方。可以说,没有它,就没有今天看到的计算机,计算机的发展也就无处可谈。
补码的计算
补码的符号位与反码一致,数值位进行如下变换:对于正数,数值位不变;对于负数,数值位最后1位+1,注意考虑进位情况。
补码的处理逻辑
仔细分析计算过程,第一道减法题只是按位运算,而第二道减法题涉及借位运算。
在电路设计中,按位直接运算的实现逻辑很简单,但是如果涉及借位,电路将十分复杂,且不一定高效实用,故需要找到一种方法,让电路避免进行进位计算。
对第二道计算题,可以采用这种方法:32-28=(99+32)-(28+100-1),注意到99=100-1,表达式换了之后结果不变,但是有趣的事情发生了!
(99+32)-(28+100-1)=(99-28)+(32+1)-100=104-100=4
99-28没有借位,104-100也没有借位,问题解决!
那么这和二进制补码有什么关系呢?看下面n位无符号二进制数的运算过程即可明白!
移码
移码可以用来直接比较大小,算法即为补码的符号位+1即可,用于浮点数的阶码(后续介绍)。