首页 > 编程知识 正文

计算机原码补码反码,单片机原码反码补码

时间:2023-05-03 14:09:05 阅读:39656 作者:4816

最近花了一点时间对计算机的源代码、反码和互补代码进行了研究,了解了为什么需要反码和互补代码以及他们这样设计的原因

机器数量在计算机上的表现形式叫做机器数量。 这个数有正负两种,电脑使用一个数的最高有效位(符号位)来表示这个正负。 其中,0表示正,1表示负。

例如,正数7在计算机中用8位的二进制数表示,是00000111。 另一方面,负数-7用100000111表示,其中000111和1000111是机器数量

与真数计算机中的随机数相对应的真值为真数,将最高位(符号位)之后的二进制数转换为十进制数,从最高位开始决定该数的正负。 在上面的00000111和10000111中,将最高位后的二进制数转换为十进制数时为7,合并最高位的值,相应的真数分别为7和-7

原代码用第1位表示符号,剩下的位表示值。 由于第一位是编码位,所以8位二进制取值的范围是[1111_1111、0111_1111]即[-127、127],原代码是人脑容易理解的表现

对正数进行可逆编码的补数可逆编码是其自身的,负数的可逆编码使已编码比特保持不变,剩下的比特取反。 例如,正数1的原代码是[0000_0001],其逆代码是其自身

[0000_0001],-1的源代码为[1000_0001],其反码为[1111_1110]

补数的正数是其本身,负数的补数基于其反码是1,例如正数1的原码是[0000_0001],他的补数是其本身[0000_0001]。

-1的补数为[1111_1111]

有原码为什么要用反码和补码,是因为人脑可以知道第一位是符号位,可以根据符号位加减乘除真值的绝对值。 但是,对于计算机来说,加减乘除是最基本的运算,需要尽可能简单地设计。 计算机判断符号位时,计算机的设计电路变得复杂,符号位也可能参与运算。 减去一个数,等于加上他的负数。

使用原代码参数的运算缺陷

从上面的原始代码表可以看出,左边每增加一个二进制单位,对应的真数就会递减,右边每增加一个二进制单位,对应的真数就会递增,所以对原始代码来说可以满足正数的加法,但不能满足负数的加法

=[0000_0011]原[0000_0001]原=[0000_0011]原=3

1 -1=[0000_00001]原[1000_0001]原=[1000_0010]原=-2

为了满足对负数加法的需求,必须同步递增或同步递减负数和与他对应的二进制代码

因此,编码比特不变,而剩馀的比特相反,从而满足增加或减少同步的要求,正数满足其本身的加法,所以不需要改变任何内容。 这就是反码定义的由来。

从上图的反码表可以看出,运算不超过0时,正负数的加法可以满足要求

-2 1=[1111_1101]反[0000_0001]反=[1111_1110]反=-1

127 1=[1000_0000]反=-127=128相加等于128。 128是最大值,超过馀数1,所以从最小值开始第一个,也就是说

最小值-127,但这里有不合理的地方。 [1111_1111]和[0000_0000]都表示0,实际计算中每次超过0时都有1个单位的误差

-1 2=[1111_1110]反[0000_0010]反=[0000_0000]反=0

要解决此问题,必须合并反转代码中的[1111_1111]和[0000_0000]。

[ 1111 _ 1111 ] [ 0000 _ 0001 ]=[ 0000 _ 0000 ],因此基于负数的反转解决了1在反转中跨越0的误差问题,且影响负数及其对应的二进制反转的同步增量这是互补符号

从上图可以看出,另一个[1000_0000]二进制文件与真数不对应,规定该数的真数为-128

因此,补数的显示范围为[-128~127]。 然后,256个二进制文件正好代表256个整数,实际二进制文件的计算超出范围的实际是256的剩余预算[x128]mod256-128。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。