原码、反码和补码

8位编码范围表汇总

在这里插入图片描述

1、原码

源码的范围:-127 ~ +127,最高位是符号位,0表示正数,1表示负数
[+127]原 = 0111 1111
[-127]原 = 1111 1111

数值“0”由两种原码表示形式:
[+0]原 = 0000 0000
[-0]原 = 1000 0000

2、反码

源码的范围:-127 ~ +127,最高位是符号位,0表示正数,1表示负数
在这里插入图片描述
[+127]反 = 0111 1111
[-127]反 = 1000 0000

数值“0”由两种反码表示形式:
[+0]反 = 0000 0000
[-0]反 = 1111 1111

3、补码

源码的范围:-128 ~ +127,最高位是符号位,0表示正数,1表示负数
在这里插入图片描述
[+127]补 = 0111 1111
[-128]补 = 1000 0000

因为 [-127]反 = 1000 0000 而 [-127]补 = 反 + 1 = 1 0000001
所以 [-128]补 = 1000 0000
哈哈,看明白了吗,懂了吗,其实你没懂

注意:补码比原码和反码多表示一个负数,即 -128.
数值“0”只有一种补码表示形式:
**[+0]补 = [+0]反 = 0 0000000
如果 [-0]补 = [-0]反 +1 = 1 1111111 + 1 = 1 00000000,这个结果是用来表示 -128,而8位字长的0000 0000是表示[+0]的,产生冲突。 所以0只有一种补码形式 **

其中反码+1,结果只保留低位的7位数字位,溢出的会置位溢出,而结果只保留低七位
注意到补码中,最大数是符号位为0,数值位全1
最小数是符号位为1,数值位全0

你肯定会问了,1000 0000为什么表示 -128呀,取反加一不对呀。嗷嗷的。
说白了,补码就是同余1000 0000是正128你知道吧,正负128模256是同余的。加减乘可以直接算也是同余的定理决定的,而不是凑出来的巧合,哪可能凑出这种东西?8位只能表示256个数,0到255,但我还想表示一些负数怎么办呢?就用与该负数同余的正数来表示呗。-1=255,-2=254,等等。**建议脱离算数的思维方式,这其实就是一个环。**模任何一个正整数(如256),可以把所有整数分类,比如模256可分256类,0、256、-256…是一类(余0类),1、257、-255…是一类(余1类),等等,这256类可看作环的元素,你看-128和128是同一个类里的(余128类),用一个代表另一个罢了。补码和普通的unsigned integers都是在每类中选一个数,unsigned integers选0到255,补码表示的有符号整数选-128到127,都是一个数恰好对应一个类。当你明白这一切后,补码就是顺理成章的事。要求作加减乘运算的时候,可以直接把编码当正整数算,能得到正确结果。

补数

一对补数,两者之间的绝对值之和等于模,即 -a 的补数 = 模 - a的绝对值
在数论中,有 取模结果相同的数,定义为一类数
这样,两个数的减法操作就容易用加法操作进行替换,计算机里通常是使用两个数的补码的加法进行替换减法操作。
例如,时钟里面 10 - 3 = 10 + 9, 其中 9 = (-3) mod 12
在这里插入图片描述

4、带符号编码之间的换算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值