b2c信息网

您现在的位置是:首页 > 热点事件 > 正文

热点事件

二进制的源码和补码怎么表示(二进制的源码和补码怎么表示出来)

hacker2023-03-11 16:30:34热点事件162
本文目录一览:1、数据背后的二进制-原码、补码2、

本文目录一览:

数据背后的二进制 - 原码、补码

在计算机中数据是以二进制存储的。

在数据中,每个位置都有一个 位权 。以十进制为例,从右到左,以0开始,第一位是1即 10 0,第二位是10即10 1,第三位是100即10^2,以此类推。所以数据 315 = 3 * 10^2 + 1 * 10^1 + 5 * 10^0。

二进制和十进制的表示类似,十进制每个位置的表示范围是 0 - 9,位权是 10^右倒数位置,二进制每个位置范围是 0 - 1,位权为 2^右倒数位置。

一些十进制的二进制表示示例:

8 = 1000

18 = 10010

100 = 1100100

十进制的负数是在前面加-,如-18,那二进制呢?

二进制使用最高位表示符号位,1表示负数,0表示正数

整数有4种类型:byte、short、int、long ,分别占1、2、4、8字节,一个字节8位,所以符号位分别为8、16、32、64位。

以byte为例,如果要表示 byte b = -1,二进制显示是多少呢?

这里就关系到二进制的原码和补码表示法。

原码表示法就是去掉符号数字的二进制表示法,再根据正负,将符号位标为0或者1。

正数的原码、补码相同。

负数的补码表示法是在正数原码表示的基础上取反,再加1。

原码、补码表示示例:

8 :原码 00001000,补码 00001000

1 :原码 00000001,补码 00000001

-1 : 原码 10000001,补码 11111111(1的原码是00000001,取反是11111110,再加 1,是 11111111)

-127 :原码 111111111,补码 10000001(127 的原码是 01111111,取反是 10000000,加1 ,是1000001)

如果根据一个负数的二进制表示,计算它的十进制呢?

采用和补码相同的运算,取反再加1。如 10000001,取反是01111110,加1是 01111111,十进制值是 127,所以10000001 的值为 - 127

计算机的运算采用的是补码运算

以 1-1 = 0 举例,因为计算机只能做加法,所以1-1 被转换为 1 + (-1),如果使用原码计算,则是 00000001 + 10000001 = 10000010,得到的原码结果是 -2,不符合预期。若采用补码的方式,则是 000000001 + 11111111 = 00000000,这才是正解。

二进制的原码、补码、反码详解

计算机中,并没有原码和反码,只是使用补码,代表正负数。

使用补码的意义:可以把减法或负数,转换为加法运算。从而简化计算机的硬件。

------------

比如钟表,时针转一圈,周期是 12 小时。

倒拨 3 小时,可以用正拨 9 小时代替。

9,就称为-3 的补数。

计算方法:12-3 = 9。

对于分针,倒拨 X 分,就可以用正拨 60-X 代替。

------------

如果,限定了两位十进制数 (0~99),周期就是 100。

那么,减一,就可以用 +99 代替。

24-1 = 23

24 + 99 = (1) 23

忽略进位,只取两位数,这两种算法,结果就是相同的。

于是,99 就是 -1 的补数。

其它负数的补数,大家可以自己求!

求出了负数的补数,就可用加法,代替减法了。

------------

计算机中使用二进制,补数,就改称为【补码】。

常用的八位二进制是:0000 0000~1111 1111。

它们代表了十进制:0~255,周期就是 256。

那么,-1,就可以用 255 = 1111 1111 代替。

所以:-1 的补码,就是 1111 1111 = 255。

同理:-2 的补码,就是 1111 1110 = 254。

继续:-3 的补码,就是 1111 1101 = 253。

。。。

最后:-128,补码是 1000 0000 = 128。

计算公式:负数的补码=256+这个负数。

正数,直接运算即可,不需要求补码。

 也可以说,正数本身就是补码。

------------

补码的应用如: 7-3 = 4。

用补码的计算过程如下:

7 的补码=0000 0111

 -3的补码=1111 1101

--相加-------------

 得:(1) 0000 0100 = 4 的补码

舍弃进位,只保留八位,作为结果即可。

这就是:使用补码,加法就代替了减法。

所以,在计算机中,有一个加法器,就够用了。

原码和反码,都没有这种功能。

------------

原码和反码,毫无用处。计算机中,根本就没有它们。

二进制原码、反码、补码运算及标志位

原码:

正整数的原码:这个数的二进制,符号位为0;正整数的原码=补码=反码

例1:+66

66的二进制:1000010,所以+66的原码: 0 1000010 =补码: 0 1000010=反码: 0 1000010

负整数的原码:仍是这个数的二进制,符号位为1;负整数的原码、反码、补码计算:先求原码,再求反码,最后求补码;

原码转换为反码:符号位不变,数值位按位取反;

原码转换为补码:符号位不变,数值位按位取反,末尾在+1;

例2:-66

66的二进制:1000010,所以-66的原码:1 1000010  补码:1 0111101 反码:1 0111110

二、二进制原码、反码、补码的加减运算及标志位

1.补码加减基本公式

加法:

整数 [A]补+[B]补=[A+B]补 (mod 2n+1)

小数 [A]补+[B]补=[A+B]补 (mod 2)jianfa

减法:

整数 [A-B]补=[A]补+[-B]补 (mod 2n+1)

小数 [A-B]补=[A]补+[-B]补 (mod 2)

2.标志位

CF(Carry Flag) :   进为标志位。主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。在8位二进制中,如果计算的结果超过 [0,255] 的范围,就有进位,CF就被置为1,如果结果再 [-128,127] 范围内,就是没有进位CF被置为0。

OF(Overflow Flag) :溢出。用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。在8位二进制中,如果一个运算的结果最终超过 [-128,127] 无论是大于127还是小于-128就被认为是溢出,OF被置为1,如果结果在 [-128,127] 就认为没溢出OF被置为0。

SF(Sign Flag) :符号标志。用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

ZF(Zero Flag) :零标志。用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

PF(Parity Flag) :奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

AF(Auxiliary Carry Flag) :辅助进位标志。在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。

二进制的原码、反码、补码、移码

之前了解一些原码、反码、补码,但是一直有疑问,为什么会有原码、反码、补码?所以决定研究一下。

计算机中参与运算的数有两大类:无符号数和有符号数。此篇主要看一下有符号数。在了解原码、反码、补码前需要先了解机器数和真值。

对于有符号数而言,使用“0”表示正,“1”表示负,这种把符号“数字化”的数称为 机器数 ,也就是一个数在计算机中的二进制表示。

例如:+1100 在机器中表示为 0 1100;-1100 在机器中表示为1 1100

整数的符号位和值用逗号隔开,小数的小数点用点来隔开。

例如:+3转换成二进制就是00000011,-3就是10000011,这就是机器数。

带符号位的机器数对应的真正数值就是 真值 。例如:1000 0011的真值是-3,而不是131,它的最高位是符号位。

下面开始说原码、反码、补码。

原码是机器数中最简单的一种表示形式,包括符号位和数值位。

原码: 符号位加上真值的绝对值,即第一位表示符号位,其余为表示值。原码是人脑最容易理解和计算的表示方式。

整数原码的定义:

小数原码的定义为:

原码的问题:

以正负1来说明问题,先来看1+(-1)的计算过程:

1+(-1)=0,但是用原码来算结果却是-2,原码的加法没有问题,但是减法却出现了问题。

为了解决原码做减法时出现的问题,出现了反码,我们用其他的方式来表示负数,使减法的问题用加法去解决。

补数的思想:

要了解补码的思想就要知道“模”、“同余”、“补数”的概念。

在日常生活中,常会遇到“补数”的概念。计算机组成原理(唐朔飞)中举了一个时钟的例子,现在是6点钟,要到达3点钟的话该怎么办呢?我们可以顺时针方向将时针移动9小时,或是逆时针移动3小时,我们都可以到达3点钟,假设顺时针转为正,逆时针转为负,则有:

钟表时针转一圈能代表12个小时,在数学上称12为模,写作mod 12,对于mod 12而言,+9和-3互为补数,3和15是同余关系,记作3≡15 (mod 12),3 + 12 = 15.

其实就相当于没到12点就丢失,从0点重新开始。

将补数的概念用到计算机中,便出现了补码这种机器数。

补码 :正数的反码是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1),这里只是便于计算才这样说。

对于补码,相当于是模加上真值,就如同上面的6+(-3),-3就是真值。

整数补码的定义为:

例如:

当x=+1010时,[x] 补 =0,1010;

当x=-1101时,[x] 补 =2 n+1 + x = 2 5 - 1101 = 100000 - 1101 = 1,0011

小数补码的定义为:

小数补码定义中mod 2的由来:

例如:

当x=+0.0110时,[x] 补 =0.1001;

当x=-0.0110时,[x] 补 =2 + x = 10.0000 - 0.0110 = 1.1010

当x=0时,

[+0.0000] 补 =0.0000;

[-0.0000] 补 =2 + (-0.0000) = 10.0000 - 0.0000 = 0.0000;

显然[+0] 补 =[-0] 补 =0.0000,即补码中的“零”只有一种表示形式。

补码的符号位扩展:

1、补码的正负小数符号位扩展就是在末尾加0即可,例如:1.1101扩展为1.1101 0000

2、补码的正数符号位扩展在最高位前面加0即可,例如:0101扩展为0000 0101

3、补码的负数符号位扩展在最高位前面加1既可以,例如:1010扩展为1111 1010

反码通常用来作为由原码求补码或者由补码求原码的中间过渡。

反码: 正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。 这个方法只是利于计算,但是并不代表反码的真正含义,可以把它忘记

整数反码的定义为:

小数反码的定义为:

因为补码符号位和数值一起编码,所以很难从补码上直接判断出其真值的大小,而用移码就可以很直观的看判断出来。

移码的定义:

利用移码的这一特点,当浮点数的阶码用移码表示时,就能很方便的判断阶码的大小。

移码 相当于补码的符号位取反。

对于补码来说是存在符号位的,使用移码就相当于把补码的负数部分往上移动,使得最小值变为0,而不是负数。

移码更详细的用处以后再研究。

写在最后:

二进制中的反码、补码、原码是什么?

在计算机系统中,数值,一律采用补码表示和存储。

也就是说,在计算机中,只有补码,并没有原码和反码。

补码,实际上,也就是一个“代替负数”的正数。

所以,使用了补码之后,计算机中,就没有负数了。

而且,在计算机中,也就没有减法运算了。

因此,计算机只需有一个加法器,就可以打遍天下。

补码的功能之一,就是可以简化硬件!

原码和反码,都没有这种功能。

所以,计算机,根本就不用它们!

它们是干什么的呢?

就是用来唬人的。

是为了让这些计算机老师,混碗稀粥喝。

------------------------

补码(也就是正数),怎么就能代替负数呢?

其实,很简单。

你看钟表的时针,倒拨 3 小时、正拨 9 小时,效果相同吧?

你看三角函数,-π/2 和 +3π/2,两者的函数值,相同吧?

再看 2 位 10 进数,0~99,计数周期是 10^2。

可以看到:

 25 - 1 = 24

 25 + 99 = (一百)  24

你只要忽略进位(10^2),+99 和-1 就是等效的。

以上这些,有如下规律:

 正数 = 负数 + 周期。

这个正数,就是“负数的补数”,它就可以代替负数,进行运算。

在三角函数中,负角度,和正角度,是怎么变换的呢? 

也是用这样的公式: 正角度 = 负角度 + 周期(2π)。

----------------------

计算机用二进制,补数,就称为:补码。

8 位 2 进制数,它们可以构成 256 组代码。

所以,计数周期就是:2^8 = 256。

求补码的公式是: 补码 = 负数 + 周期(2^n)。

-1 的补码就是:-1 + 256 = 255

 = 1111 1111 (二进制)。

-2 的补码就是:254 = 1111 1110。

。。。

-128 的补码就是:128 = 1000 0000。

以上就是 256 组代码中的 128 个负数补码。

正数,必须直接参加运算,不许做任何变换。

正数本身,已经就是正数,所以并不存在什么“正数的补码”。

-------------------------

举例说明,如: 5 - 7 = -2。

用八位补码计算的过程如下:

5 = 0000 0101

-7的补码= 1111 1001

--相加-------------

 得:  (1)  1111 1110 = -2 的补码

舍弃进位,只保留八位,这就用加法,实现了 5-7。

----------------------

计算机,只用补码,因为补码运算符合数学的规律。

而原码反码,都是人为虚构出来的。

即使把它们说出天花来,它们也是不存在的。

求反加一、符号位不变。。。是怎么回事?

老外数学不好,才会想出这些个烂办法。

二进制反码,补码,原码的概念以及表示法

补码、原码、反码,这些都是计算机专家编造的词汇。

事实上,它们,都不应该存在。

计算机的运算,是很简单的,和这些词汇,并没有任何关系。

--------------------------

你想象一下:

有一个小朋友,很小的,大概是三岁吧。

他只会数一百个数(0~99),会加法,还不会做减法。

那么,你可以这样教他:加 99,就是减一。

比如: 25 - 1 = 24

25 + 99 = (一百) 24

让他只取 2 位数,忽略进位,结果,就是正确的。

--------------------------

上面是一个简单的例子,却说明了一个事实:

做计算时,限定了位数,正数,就能当做负数使用。

限定了位数,有两个意义:

数值是循环的,具有周期性;

有没有进位,都不必考虑。

代替负数的正数,怎么求呢?

公式,你一定能看出来: 正数 = 负数 + 周期。

--------------------------

在计算机中,8 位 2 进制,称为一个字节。

计数值范围是:0000 0000~1111 1111。

对应的十进制:0 ~ 255。

计数周期,是:2^8 = 256。

这里,共有 256 个机器数。

较大的128 个,就可以代表负数了:

 -1 补码就是:-1 + 256 = 255 = 1111 1111。

 -2 的补码 = 254 = 1111 1110 (二进制)。

 。。。

 -128 的补码 = 128 = 1000 0000 (二进制)。

较小的 128 个,就代表自身的数值了:0 ~ 127。

--------------------------

减法算式: 5 - 7 = -2, 用 8 位补码计算如下:

  5 = 0000 0101

 -7 的补码 = 1111 1001

--相加---------------

得: (0)  1111 1101  = -2 的补码

在这里,用加法代替减法,略去进位,结果,就完全正确。

--------------------------

用正数(补码)代替了负数,减法运算也就没有了。

因此,计算机的硬件,就可以得到简化了。

所以,在计算机系统中,负数,一律采用补码表示和存储。

原码和反码,在计算机中,根本就不能用。

事实上,它们,根本就不存在。

--------------------------

什么是补码? 为什么要用补码?

看完上面的介绍,相信你都有了答案。

那么,原码和反码,就没有任何意义了。

这两种代码,只是用来求补码的过渡而已。

其实,原码和反码,还有“取反加一”,都是“鸡肋”。

浪费不少时间学习这些,却不能理解【补码的意义】何在。

况且,用“取反加一”求 0 和-128 的补码,就是难事。

 -128,它没有原码和反码,拿什么取反加一?

 -0 的补码,求出来是 0000 0000。

 符号位,居然是 0 !

 难道,负零,是正数吗?

 有人说,零,不分正负,所有只有一个补码。

 那么,原码反码中,为什么有两个零?

--------------------------

其实,原码反码符号位取反加一,就是一大篇自相矛盾的谬论。

小学生都弄懂的事,他们竟然弄出这许多骚操作!

老外数学不好,由此可见一斑。

发表评论

评论列表

  • 闹旅只酷(2023-03-12 03:27:14)回复取消回复

    01--相加---------------得: (0)  1111 1101  = -2 的补码在这里,用加法代替减法,略去进位,结果,就完全正确。--------------------------用正数(补码)代替了负数,减法运算也就没有了。因此,计算机的硬件,就可以得到简

  • 酒奴棕眸(2023-03-12 03:14:42)回复取消回复

    飞)中举了一个时钟的例子,现在是6点钟,要到达3点钟的话该怎么办呢?我们可以顺时针方向将时针移动9小时,或是逆时针移动3小时,我们都可以到达3点钟,假设顺时针转为正,逆时针转为负,则有: 钟表时针转一圈能代表12个小时,在数学上称

  • 鸠骨庸颜(2023-03-11 23:48:41)回复取消回复

    过程如下:5 = 0000 0101-7的补码= 1111 1001--相加------------- 得:  (1)  1111 1110 = -2 的补码舍弃进位,只保留八位,这就用加法,实现了 5-7。----------------------计算机,只用补

  • 末屿晕白(2023-03-11 21:49:25)回复取消回复

    7。--------------------------减法算式: 5 - 7 = -2, 用 8 位补码计算如下:  5 = 0000 0101 -7 的补码 = 1111 1001--相加--