原码,反码,补码之详解

一:计算机二进制存储

1.在计算机中数字都是以二进制存储的。
 二进制的组成分为两部分,符号位和数值位

  • 符号位(高1位):0表示正数,1表示负数
  • 数值位(低n-1位):根据表示方式的不同而不同

如: 在1000 0001中,1是符号位,000 0001 是数值位。转换成十进制之后表示的是-1。

2.计算机中二进制存储表示方式有3种:原码,反码,补码
但是存储的时候都是以补码的方式来进行存储的,具体的原因下面会分析

二:模

模:一般指的是一个计数系统的计量单位。
如果把计算机看成是一个计量机器,因为计算机的字长是定长的,即存储和处理的位数是有限的, 所以也是有一个计量范围,即存在一个模。如时钟的计量范围是0-11,那么模就是12;在计算机中,表示n位的计量范围是 0~2n-1,那么模就是2n
也可以把模理解为是计量器产生的溢出值。

在数学上,模也叫做同余。在数论中的定义为,给定一个正整数m,如果整数a和b满足a-b能够被m整除,即(a-b)/m得到的是一个整数,那么就说整数a与b对模m同余,记作a=b(mod m)。在数学上,当两个整数除以同一个正整数n,若得相同余数,则二整数对于模n同余(congruent modulo n)。

三:原码,反码,补码

原码:原码通过符号位和数值位可以直观的看出表示的十进制数值
反码:原码的缺点是不能直接参数计算,例如:
 在数学上1+(-1)=0
 原码的计算:
 00000001+10000001=10000010,换算成十进制为-2,显然是有问题的

 所以就出现了反码,正数的反码就是原码,负数的反码是在原码的基础上符号位保持不变,数值位取反
 如1+(-1)=0
 反码的计算:
 0000 0001+1111 1110=1111 1111
 反码1111 1111对应的原码是1000 0000,换算成十进制位-0

 现在可以看到数值部分是计算正确的,但是需要注意的是对于十进制的数字0,反码有两种表现形式,1000 0000和0000 0000。然而在十进制中,数字0是不区分正负的,所以反码在0对于0的两种编码是不符合预期的
 所以就出现了补码

补码正数的补码是原码;负数的补码是在原码的基础上符号位保持不变,数值位取反后+1
 如1+(-1)=0
 补码的计算:
 0000 0001+1111 1111=0000 0000

 这样的话数值0就只有一种编码0000 0000 ,补码的出现同时解决了0的符号和两种编码的问题。所以这里也就印证了上面说的补码中可以将符号位和数值位进行加减法统一的处理,即统一按加法进行计算。

补码出现的论证
假设当前时钟指向是8点,如果想要调整到6点,那么调整的方法有两种,一种是往后拨2个小时,即8-2=6;另外一种往前拨10个小时,即8+10=12+6;
那么8-2=(8+10)mod 12。
我们的目标是6点,而6和8+10在模为12上是同余

就像是上面说的,时钟本身就是一个计量机器,模是12,在这样的系统,加10和减2是一样的效果,因此但凡是-2的操作都可以用+10来替代,也就是说所有的减法都可以用加法来表示:
数学公式:
a-b=a-b+mod=a+mod-b
8-2=8-2+12=8+12-2=8+10

对于值为12的模来说,2和10就是补数,介于[0,11]之间数a和12-a都是互为补数。
同理,在计算机上面,n为计算机,假设n=8,那么8为可以最大表示1111 1111,1111 1111+1=1 0000 0000,因为是8为计算机,所以只能保存低8位,即 0000 0000。所以8位二进制系统的模为28,那么根据上面时钟的例子,可知我们也可以将减法转换为加法,只需要将减数用对应的补码来表示就可以

补码出现的意义在于

  1. 解决了符号的表示问题
  2. 可以将减法运算转换为加法
  3. 补码统一了符号位和数值位,使得他们可以一起参与运算
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原码反码补码计算口诀是: 1. 原码:符号位加上真值的绝对值。 2. 反码:将原码中的符号位保持不变,其余位取反。 3. 补码反码加1。 例如,对于一个8位二进制数,如果要计算其反码,可以按照以下步骤进行: 1. 将符号位保持不变。 2. 将其余位取反。 对于补码的计算,可以按照以下步骤进行: 1. 先计算其反码。 2. 在反码的基础上加1。 这样,就可以得到原码反码补码的计算结果。 #### 引用[.reference_title] - *1* [原码, 反码, 补码的基础概念和计算方法](https://blog.csdn.net/Chinajsczlymyc/article/details/126910306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [(转)java 原码反码补码计算 以及 取反运算,原码反码补码运算公式](https://blog.csdn.net/PacosonSWJTU/article/details/128604733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [原码,补码,反码概念和计算方法详解](https://blog.csdn.net/qq_39541098/article/details/122729622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值