对于原码、反码、补码的深入理解

对于原码、反码、补码的深入理解@TOC

写在前面的话

从开始学C语言开始,就比较害怕原码反码补码,当时没学好,导致现在遇到还是比较害怕,为了战胜它,这次准备一口气弄懂原码反码补码的区别,让自己以后不害怕!!!

原码反码补码的前身–机器数和真值

机器数:一个数在计算机中的二进制表现形式叫做这个数的机器数。机器数有正有负,最高位为0代表正数,最高位为1代表负数。
例如:+3,在8位计算机中表示为:0000 0011;
-3,在8位计算机中表示为:1000 0011。
真值:真值代表机器数(在计算机中以二进制的形式表示)实际表示的十进制数。
例如:0000 0011→+000 0011→+3;
1000 0011→-000 0011→-3。

原码反码补码

理解了上面的机器数和真值的概念后,我们来开始原码反码补码!!!

  1. 原码(机器数)
    正数:原码=机器数
    例如:+3 →0000 0011(原码)→0000 0011(机器数)
    负数:原码=机器数
    例如:-3→1000 0011(原码)→1000 0011(机器数)

  2. 反码
    正数:正数的反码=正数的原码
    例如:+11→0000 1011(原码)→0000 1011(反码)
    负数:负数的反码=负数的原码中,符号位不动,其余位数取反(0变1,1变0)
    例如:-11→1000 1011(原码)→1111 0100(反码)

  3. 补码
    正数:正数的补码=正数的反码=正数的原码
    例如:+15→0000 1111(原码)→0000 1111(反码)→0000 1111(补码)
    负数:负数的补码=负数的原码取反+1=负数的反码+1
    例如:-15→1000 1111(原码)→1111 0000(反码)→1111 0001(补码)

关于8位数取值范围[-128,127]问题

  1. 对于8进制数的原码取值范围
    8进制的原码取值范围是[-127,127]。对于原码来说1000 0000是没有意义的

  2. 对于8进制数的反码取值范围
    为了解决原码中的减法问题,提出了反码,让A-B变成A+(-B)的形式,其中(-B)为B的反码,为此提出反码。
    8进制的反码取值范围是[-127,127]。只是反码中有两个二进制码都表示0,分别为0000 0000=+0,1000 0000=-0

  3. 8进制补码解决反码中0有两种编码问题
    为了解决反码中出现的0有两种编码的情况,即0000 0000和1000 0000都代表0的情况,补码出现了,补码通过对反码加一,新增了一个最小数,将1000 0000(0的另外一种表达方式)作为最小数,解决了反码中0有两种编码方式的问题。扩大了补码的取值范围为:[-128,128]

负数的原码和补码的关系

负数的补码代表的真值= -128-(负数);
例如:求-15的补码
(-15)的补码真值 = -128-(-15)=-113;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值