首页 > 编程知识 正文

补码原码反码怎么转换(0的原码反码补码)

时间:2023-05-06 10:43:39 阅读:93585 作者:4199

今天由传智播客的老师讲解电脑的原码、反码和补码。 然后详细探索了为什么要使用反码和补码,以及为什么反码、补码的加法可以做原码的减法。

一. 机器数和真值

在学习二维码、反码、补数之前,需要理解机器数量和真值的概念。

1、机器的数量

在计算机中的数的二进制表示,称为这个数的机器数。 机器的数量是带符号的,在计算机中用一个数量的最高位存储符号,正数为0,负数为1

例如,十进制数中的数3在计算机的字长为8位,转换为二进制数后为00000011。 -3的情况下为10000011。

那么,这里的0000011和10000011是机器数。

2、真值

机器的第一位数是符号的位数,后面是真正的数值。 因此,机器数量形式的值不等于真正的数值。 例如,上面的符号10000011的最高位1表示负,其真实值为-3而不是形式值131。 (10000011转换为十进制数后为131。 因此,为了区别,将与带符号比特的设备数对应的真数值称为设备数的真值。

示例:

0000 0001的真值= 000 0001= 1

1000 0001的真值=0000001=1

二. 原码, 反码, 补码的基础概念和计算方法.

在探索为什么机器要使用补码之前,让我们先来理解原码、反码、补码的概念。 对于一个数量,计算机必须以一定的编码方式进行存储。 原码、反码、补数是机器记忆具体数字的编码方式。

1 .源代码

原代码是指在符号位上加上真值的绝对值,也就是说用最初的位表示符号,用剩下的位表示值。例如如果是8位二进制的话,则为:

[ 1] (源代码)=0000 0001

-1(源代码)=1000 0001

第一位是符号位。 因为第一位是符号位,所以8位二进制数的范围是:

[ 1111111,0111111 ]

也就是说

[-127,127 ]

源代码是人脑最容易理解和计算的表示方式。

2 .反向代码

反符号的表示方法为,正数的反符号其本身,负数的反符号以其原符号为基础,符号比特不变化,剩下的各比特取反。

[ 1]=[00000001] (原始代码=[00000001];反代码) ) ) ) ) ) ) ) )至) ) ) ) )。

-1=10000001 (原码=[11111110] )反码) )。

逆向代码表示负数时,人脑无法直观地看到该数值。通常将其转换为原始代码进行计算。

3 .补数

补数的表示方法是:正数的补数本身,负数的补数根据其原数,符号的位数不变,剩下的位数取反,最后1.(即根据反码1 ) ) ) ) ) ) ) ) )

[ 1]=[00000001] (原代码() 0000001 )反代码) ) 0000001 ) )补充代码) ) ) )。

[-1]=[10000001]原码=[11111110]反码=[11111110]辅助码]

关于负数,补数的表示方法人脑无法直观地识别其数值。通常需要转换为原始代码来计算其数值。

三. 为何要使用原码, 反码和补码

开始深入学习之前,我的学习建议是先“死记硬背”上面的源代码、反码和补码的表示方法和计算方法。

现在,我们知道计算机可以用三种编码方式表示一个数。 这是因为对于正数,三种编码方式的结果都相同,为:

[ 1]=[00000001] (原代码() 0000001 )反代码) ) 0000001 ) )补充代码) ) ) )。

所以,不需要太多说明。 但是,关于负:

[-1]=[10000001]原码=[11111110]反码=[11111110]辅助码]

可见源代码的反码和补码完全不同.既然源代码才被人脑直接识别并用于计算和显示,为什么会有反码和补码呢?

首先,人脑能够知道第一位是符号位,因此在计算时根据符号位选择真值区域的加减。 ()真值的概念在本文的开头)。 但是在计算机中,加减乘数已经是最基础的运算,需要尽量简单地设计。 计算机判别“符号位”显然会使计算机的基础电路设计非常复杂。 于是人们想出了符号位也参加运算的方法。 我知道根据运算法则减去一个正

数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.

于是人们开始探索 将符号位参与运算, 并且只保留加法的方法. 首先来看原码:

计算十进制的表达式: 1-1=0

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.

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

计算十进制的表达式: 1-1=0

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

发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0.

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

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

这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:

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

-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)

使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].

因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.

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