原码 反码 补码,补码的意义及由来

本文介绍了计算机中机器数的表示,包括带符号的二进制形式,以及原码、反码和补码的概念及其计算方法,重点解释了补码如何简化减法运算的设计。

1.机器数和真值

        计算机用二进制存储数据。一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1。 

        一般计算机的字长为8位,最高位为符号位。十进制数3转化为机器数就是 00000011 ,十进制数-5转化为机器数就是 10000101 。

        由于符号位的存在,机器数10000101的真实值是-3,而不是形式值133。因此为了区别形式值和真实值,将规定符号位的机器数的真实数值称为机器数的真值。 

2.原码 反码

        原码:

        原码就是符号位加上真值的绝对值

        例子:3的原码为:00000011

                   -4的原码为:10000100

        反码

        正数的反码是其本身

        负数的反码:符号位不变,其余位取反

        例子:-4的反码:11111011

3.补码的计算,由来和意义

        计算机在执行计算时,只对机器数进行加法运算。不用减法运算的原因是,设计减法运算会使得电路变得繁琐。同时由于符号位的特性,如果设计电路识别符号位,电路的复杂程度更会大幅上升。所以人们想出了一个好方法。如计算1-2时,将其转化为1+(-2)来计算,就同时优化掉了减法操作和对符号位的识别。具体的计算依靠的便是补码。

        补码的计算:

        正数的补码是其本身。

        负数的补码是其反码+1。

        例子:-4的补码:11111011+1=11111100

        注意:这不是补码的定义,仅是补码的计算方式

        补码的意义及由来:

        在计算机器数的减法时,直接使用原码是不行的。如5+(-3):00000101+10000011,结果为10001000,显然错误了。于是补码就应运而生。举个钟表的例子吧。

        有一个不同的钟表,长这样:

        4点往回走5个小时,时间就到了11(-1)点,这个过程可以看作4+(12-5)=11。由于4-5和4+7的值相同,所以我们可以把减法转换为加法。二进制数也是这样。

        加法计算中的7是怎么来的呢?7=12-5,12可以简单理解成进位,即最大值+1

        所以 举个三位二进制数的例子。如果要求101-010(5-2),我们可以转换成5+(8-6)即101+110.这里,010就是110的补码

        我们可以来计算一下。110取反,即111-110=001,为110的反码。按照补码的计算,反码加一,也即111-110+001,调换顺序,111+001-110.加粗的部分刚好就是模的大小(8)所以这就是补码的来历,即凑出形似8-6的格式来完成减法的计算。这就是补码的由来

        补码的真正定义

        

首先,我们需要了解如何将十进制转换成二进制的原码、反码补码。 1. **原码**:正数直接表示,负数则最高位为1(对于有符号整数)。 - **95 (十进制)**: 原码 = 000001010101(因为95在8位内,不足8位补0) - **-131 (十进制)**: 原码 = 111110100011 (负数最高位为1) 2. **反码**:对原码取反,然后加1(对于有符号整数)。负数的反码是除符号位外全变1。 - **95 (十进制)**: 反码 = 111110101010 (+95的反码) - **-131 (十进制)**: 反码 = 000001011100 (-131的反码) 3. **补码**:也是对原码取反,然后加1,但对于负数,有一个特殊情况:零的补码等于其本身。 - **95 (十进制)**: 补码 = 111110101010 (+95的补码,无需调整) - **-131 (十进制)**: 补码 = 000001011101 (-131的补码,注意最后一位由1变为0) 4. **浮点数的原码、反码补码**: - **0.125 (十进制)**: 由于是小数,通常会采用偏移二进制表示法,即在最高位后面跟上实际值的二进制。0.125 = 1 / 8 = 0.00011001... - 原码 = 000000000000011001000... (保留足够位数) - 反码 = 11111111111110011111100... (先取反再加1) - 补码 = 11111111111110011111100... (小数部分不变,不需要加1) - **-0.875 (十进制)**: 同样是小数,可以将其转化为二进制形式 -0.125 * 8 = -1 = -1000... - 原码 = 100000000000001110000... (带符号,注意最左一位) - 反码 = 01111111111111000111100... (先取反再加1) - 补码 = 01111111111111000111100... (小数部分不变,不需要加1)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值