理解原码、反码和补码

概述

在开始学习之前,首先要了解机器数和真值的概念。

机器数

机器数是将符号数字化的数,是数字在计算机中的二进制表示形式。机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制。
比如十进制的+5,其表示为机器数为:0000 0101,十进制的-5表示为机器数为:1000 0101,这里的0000 0101和1000 0101为机器数。

这里是引用:
https://baike.baidu.com/item/%E6%9C%BA%E5%99%A8%E6%95%B0?fromModule=lemma_search-box

机器数的特点

1.数的符号数值化。由于计算机只能表示两种物理状态(用0与1表示),因此正数与负数在计算机中用一位二进制的0和1表示,通常这个符号放在二进制的最高位,称为符号位,以0代表正数、以1代表负数。因为符号位占据一位,机器数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。

2.二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制数叫机器的字长,一台机器的字长是固定的。字长8位叫一个字节,机器字长一般都是字节的整数倍,如8位、16位、32位、64位。

机器数的分类

根据小数点位置固定与否,机器数又可以分为定点数和浮点数。 通常,使用定点数表示整数,而用浮点数表示实数。

1.整数

整数没有小数部分,小数点固定在数的最右边。整数可以分为无符号整数和有符号整数两类。无符号整数的所有二进制位全部用来表示数值的大小;有符号整数用最高位表示数的正负号,而其他位表示数值的大小。

2.实数

实数的浮点数表示方法是:把一个实数的范围和精度分别用阶码和尾数来表示。

浮点数在计算机内的存储方式可参考:https://blog.csdn.net/u013416923/article/details/121711879

3.机器数的真值

机器数的第一位是符号位,所有机器数的形式值不等于机器数转为10进制数所代表的数值,比如上面的机器数1000 0101,其最高位是1,表示负数,代表的数值为-5,而不是形式值133,所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值

机器数的形式

1.原码

原码是计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最左边的一位为符号位):该位是0表示正数,该位是1表示负数,其余位用来表示数值的大小。

原码拥有直观的特点,例如用8位二进制表示一个数,+11的原码位0000 1011,-11的原码就是1000 1011

但是原码也有明显的缺点,原码不能直接参加运算,可能会出错。例如十进制运算:1 + (-1) = 0,而在二进制中0000 0001 + 1000 0001 = 1000 0010,换算位十进制数为-2,这显然是错误的。

2.反码

反码通常是用来由原码求补码或者由补码求原码的过渡码。

正数的反码是其本身,负数的反码在其原码的基础上,符号位不变,其余各个位取反。可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值,通常要将其转换为原码再计算。

3.补码

补码是计算机把减法运算转化为加法运算的关键编码。

正数的补码就是其本身;负数的补码是在其基础上,符号位不变,其余各位取反,最后加1(也即在反码的基础上加1);对于负数,补码的表示方式也是人脑无法直观看出其数值的,需要转换为原码再计算其数值。

为何要使用原码、反码和补码

对于人脑,在对两个二进制数进行加减运算时,会根据符号位的值然后对真值区域的数进行运算,但对于计算机,即使加减运算已经是最基础的运算,但让计算机去辨别符号位会让计算机的基础电路设计变得十分复杂。

为了解决这个问题,工程师考虑让符号位也参与运算,根据运算法则减去一个正数等于加上一个负数,所有可以将计算机设计的只有加法运算而没有减法运算。

于是人们开始探索将符号位参与运算,并且只保留加法的运算。

下面看个例子:

对于十进制:1 - 1 = 0

对于二进制:0000 0001(1的原码)+ 1000 0001(-1的原码)= 1000 0010,转为十进制为-2

如果用原码表示十进制的数,让符号位也参与运算,显然对于减法来说结果是错误的,因此计算机内部不使用原码表示一个数。

为了解决原码做减法的问题,出现了反码

同样对于以上的例子:

对于十进制:1 - 1 = 0

对于二进制:0000 0001(1的反码)+ 1111 1110(-1的反码)= 1111 1111,其原码为1000 0000,转换为10进制数为-0

发现用反码计算减法,结果的真值部分是正确的,但在“0”这个特殊的数值上,虽然+0与-0等价,但是0带符合没有意义,而且会有0000 0000和1000 0000两个编码表示0

而补码的出现,解决了0的符号问题以及0的两个编码问题:

仍然使用上面的例子:

对于十进制:1 + (-1) = 0
对于二进制:0000 0001(1的补码)+ 1111 1111(-1的补码)= 0000 0000,其原码也是0000 0000,转为十进制数为0

补码的应用发现-0的问题被解决了,而且规定用1000 0000表示-128

使用补码不仅解决了0的符号以及存在两个编码的问题,而且还能多表示一个最小值的数。

这里是引用
https://baike.baidu.com/item/%E6%9C%BA%E5%99%A8%E6%95%B0?fromModule=lemma_search-box
https://zhuanlan.zhihu.com/p/118432554

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值