关于原码、反码和补码

一、原码的定义

原码、反码和补码都是计算机中对数字的二进制定点表示方法。

原码表示法的最高位是符号位,0表示正,1表示负。其具体定义分为小数和正数定义,这里我们暂时只讨论整数的相关定义:

这里假设用1个字节来表示整数X,那么一共可以表示256个不同的X:

当X在[0,127]时,X的原码就是X;

当X在[-127,-0]时,X的原码就是128-X。

有以下需要注意的地方:

零的表示有两个:正零和负零,分别为0000 0000和1000 0000;

最大正数为127,最小负数为-127,加上正零和负零,一共256个数;

+0      0000 0000

+1      0000 0001

+2      0000 0010

+127  0111 1111

-0       1000 0000

-1       1000 0001

-127    1111 1111

 

二、反码的定义

正数的反码:与原码相同

负数的反码:最高位符号位不变,保持为1,其它各位按位取反,即:0变1,1变0。

它的表示范围同原码相同:[-127,+127],+0和-0的表示也不相同,分别为0000 0000和1111 1111。

 

三、补码的定义

正数的补码:与原码相同

负数的补码:反码+1

正零和负零的表示完全相同:0000 0000,原因很简单:正数零的反码就是零的原码,0000 0000,这没有问题;负数零的补码是其反码加1,而其反码前面已经提到,是1111 1111,它加1之后应为1 0000 0000,但是我们前面既然已经声明用1个字节来举例表示整数 ,那么最高位的1就会被舍去,因此结果也是0000 0000。

它的表示范围已经改变:[-128,+127],为何可以表示-128了呢,原因如下:

1个字节本来可以表示256个不同的数,但是现在正零和负零已经相同了,那么肯定剩下一个数没有用到,这个数就是1000 0000,可以验证:[-127,+127]中没有哪个数的补码会是这个数,原因很简单,我们可以根据这个补码求它的原码,过程如下:

首先,假设它是正数的补码。因为正数的原码、反码、补码完全相同,因此如果它是正数,那么它的原码就是它的补码,那么因此原码也是1000 0000,但我们根据原码的定义可知,最高位为1表示负数,因此自相矛盾,所以假设错误,得出结论:它不是正数;

其次,假设它是负数的补码。那么它减1就会得到其反码为0111 1111,这样也不正确,因为一个负数的反码的最高位也应该是1,也自相矛盾,所以它也不是负数的原码;

最后它只能是零的补码了,可我们已经知道正零和负零的补码相同,均为0000 0000,因此它也不是零的补码。

综上所述,它不是[-127,+127]中任何一个数的补码,那么它不就浪费了吗?为了避免浪费,我们特别地规定:1000 0000是-128的补码。

+0      0000 0000

+1      0000 0001

+2      0000 0010

+127  0111 1111

-128  1000 0000

-127  1000 0001

-1      1111 1111

所以在补码的世界里,由0开始逐渐递增,直到最大的正数后,如再加1,则跳变到最小的负数,之后又逐渐递增,直到变为最大的负数。

  

                               原码的变化图                                                                                  补码的变化图

在计算机中数都是采用补码表示,原因有二:一是原码和反码对零的表示都不相同,因此这不合数学逻辑,不适合进行数的运算,而且它们还需要对符号位做特殊处理;而补码首先对零的表示是唯一的,其次它不需要对符号位作特殊的处理,也就是符号位可以直接参与运算,补码还可以把减法当成加法来处理。

补码的运算法则:[A+B]补 = [A]补 + [B]补

因此可推导出::[A-B]补 = [A+(-B)]补 = [A]补 + [-B]补

关于负数的补码如何求的问题,包括其中涉及的进位或溢出等,以后再学习吧。

 

四、Java中的int型变量的讨论

Java中的数都是有符号数。int型变量用4个字节来表示,因此最大值是2的31次减1,最小值是负的2的31次。

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值