计算机基础(1)-原码、反码、补码

一、概念理解

1.机器数

一个数在计算机中的二进制表上形式,叫做这个数的机器数;

机器数是带符号的,最高位存放符号(0正,1负);

00000011和10000011就是机器数;

2.真值

将带符号的机器数对应的真正值称为机器数的真值;

00000011的真值是+1;

10000011的真值是-1;

3.原码

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

[+1]=[0000 0001]原;

[ -1]=[1000 0001]原;

4.反码

正数的反码是其本身;

负数的反码是在其原码的基础上,符号位不变,其余各个位取反;

[+1]=[0000 0001]原 = [0000 0001]反;

[- 1]=[1000 0001]原 = [1111 1110]反;

5.补码

正数的补码是其本身;

负数的补码是在反码的基础上+1;

[+1]=[0000 0001]原 = [0000 0001]反 = [0000 0001]补;

[- 1]=[1000 0001]原 = [1111 1110]反 = [1111 1111]补;

二、为什么使用原码、反码、补码

1.因为计算机只知道加法、对于减法就是加上一个负数;

2.为了是计算机运算设计更加简单,也将符号位参与运算;

3.使用原码做运算

1-1=1+(-1)=[0000 0001]原 + [1000 0001]原 = [1000 0010]原 = – 2

得出结论:使用原码计算减法,让符号位参与计算,结果是不正确的

4.使用反码做运算

1-1=1+(-1)=[0000 0001]反 +[1111 1110]反 =[1111 1111]反 = [1000 0000]原 = –0

得出结论:使用反码计算减法,解决了真值部分的不正确问题,唯一问题是“0”这个特殊值上,0带符号是没有意义的

[0000 0000]反 = [1000 0000]反 = 0,且0的反码有两种表示形式

5.使用补码做运算

1-1=1+(-1)=[0000 0001]补+[1111 1111]补= [0000 0000]补=[0000 0000]原 = 0

这样用0用[0000 0000]表示,而用[1000 0000]表示-128

(-1)+(-127)=[1000 0001]原+[1111 1111]原=[1111 1111]补+[1000 0001]补=[1000 0000]补

实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码

得出结论:使用补码计算,不仅修复了0的符号存在两个编码问题,而且还能多表示一个最低数

三、原码、反码、补码表示的范围

原码:

第一位是符号位,所有8位二进制的取值范围是:

[1111 1111,0111 1111] 即 [-127,127]

反码:

反码是通过原码得到的,所以范围和原码一样,也是[-127,127]

补码:

补码比反码多了一个最低数,即范围是[-128,127]

四、扩展

1.如何用一个正数替代一个负数

场景一:
钟表当前时间是6点,怎么把时间设置成4点:
方式一:往回拨2个小时:6-4= 2
方式二:往前拨10个小时(6+10)mod 12 = 4
方式三:往前拨22个小时(6+22)mod 12 = 4

2.同余的概念

两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余,

记作 a ≡ b (mod m),读作 a与b关于模m 同余

场景二:
4   mod 12 = 4,即4   ≡ 4(mod 12)
16 mod 12 = 4,即16 ≡ 4(mod 12)
28 mod 12 = 4,即28 ≡ 4(mod 12)
则4,16,28关于模12同余

3.负数取模

x mod y = x-y[x/y]

x mod y 等于 x 减去 y乘上x与y的商的下界

场景三:
(-2) mod 12 = –2 + 12*(-1) = 10,即(-2) ≡ 10(mod 12)
(-4) mod 12 = –4 + 12*(-1) = 8  ,即(-4) ≡ 8 (mod 12)
(-5) mod 12 = –5 + 12*(-1) = 7  ,即(-5) ≡ 7 (mod 12)

现在我们为一个负数找到了它 正数同余数

4.在从二进制的问题,理解下2-1=1问题

2-1=2+(-1)=[0000 0010]原+[1000 0001]原=[0000 0010]反+[1111 1110]反

-1的反码表示是1111 1110,如果[1111 1110]认为是原码,则[1111 1110]原 = -126,它的真值为126。而(-1) ≡ 126(mod 127)

得出结论:一个数的反码,实际上是这个值对于一个模的同余数,二这个模是二进制所能表示的最大值

五、参考文章

http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html#!comments

转载于:https://www.cnblogs.com/kimisme/p/5351892.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值