原码、反码和补码

0x01 原码

原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。 ——百度百科

如果我们用8为二进制表示一个数的话
+11的原码:00001011
-11的原码:10001011

1.1 原码不能直接参加运算

在数学上, 1 + ( − 1 ) = 0 1+(-1)=0 1+(1)=0
+1的原码:00000001
-1的原码:10000001
两者原码想加的结果是:00000001+10000001=10000010,转换成十进制为-2,这个结果不用想就是错的。

0x02 反码

反码通常是用来由原码求补码或者由补码求原码的过渡码。根据定义,可以得到机器数的反码的整数和小数中“0”的表示形式各有2种,“+0”和“-0”不一样,以8位机器数为例,整数的“+0”原码为0,0000000,反码为0,0000000;整数的“-0”原码为1,0000000,反码为1,1111111

摘自百度百科

正数的反码与其原码相同;负数的反码是对正数逐位取反,符号位保持为1

+11的反码:00001011
-11的反码:11110100

整数"-0"的原码为10000000,其反码为11111111

0x03 补码

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。

摘自百度百科

3.1 整数补码

正整数的补码是其二进制表示,与原码、补码相同

  • +1的原码、反码、补码都是是00000001

负整数的补码是,将其原码除符号位外的所有位取反(即反码)后加1

  • -1的原码:10000001
  • -1的反码:11111110
  • -1的补码:11111111

现在问题来类,用8位二进制表示一个带符号的整数,那么这个整数的取值范围是多少呢?

正整数取值范围是0000000101111111,即1-127。因为有一个首位为符号位,所以不可能出现128
负整数的话,先看一个数-127,

  • -127的原码: 11111111
  • -127的反码:10000000
  • -127的补码:10000001

既然有了-127的补码,那么我们很快就能得到-126的补码是10000010。现在有一个问题,-127减去1得到的补码是10000000,这个到底是谁的补码呢?-0,显然在数学上没有任何意义。
在十进制中-127-1=-128,按照这种逻辑,我们就可以定义
10000000是-128的补码。同时,-128不存在原码和反码!

3.2 模的概念

"模"是指一个计量系统的计数范围。如时钟等。
例如:时钟上的数字标记的数字为0-12-0,即循环一圈。假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨发:一种是倒拨4小时,即:10-4=6;另一种是往前拨8小时:10+8=12+6=18,还是六点。
在以12模的系统中,加8和减4效果是一样,因此凡是减4运算,都可以用加8来代替。
对"模"而言,8和4互为补数。以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。
"模"的实质上是计量器产生"溢出"的量,比如,往前拨8个小时,10+8=18,然后18/12=1…6。也就是说加上一个数之后,然后除以模取余,余数与减去一个补数的结果一致。(在这里8的补数是4)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值