补码表示法,二进制补码的表示方法
补码表示法,二进制补码的表示方法详细介绍
本文目录一览: 整数的原码,反码和补码的表示??
在计算机内,数据是以补码的形式存在的,在计算机中没有负数这个概念,意思就是计算机内部是没有减法的,他的减法是用加法运算实现的,所以要做到这步,补码和反码的符号位必须作为数值的一部分看待,不然计算机怎么知道你是正数还是负数呢?(思考一下)
1、一个正整数,当用原码、反码、补码表示时,符号位都固定为0,用二进制表示的数位值都相同,即三种表示方法完全一样
2、一个负整数,当用原码、反码、补码表示时,符号位都固定为1,用二进制表示的数位值都不相同,即三种表示方法完全一样。此时由原码表示法变成补码表示法的规则如下:
①原码符号位为1不变,整数的每一位二进制数位求反得到反码
②反码符号位为1不变,反码数值为最低位加1,得到补码
计算机中,只用补码表示正负数。
在计算机中,并不存在原码反码。
求补码,也有更简单的方法,也用不着原码反码。
所以,原码反码,都没有任何用处。
----
以八位码长,来说明计算机中的补码:
数字 0 的补码是:0000 0000。
数字 1 的补码是:0000 0001。
数字 2 的补码是:0000 0010。
。。。依次递增。。。
数字 127 的补码,就是:0111 1111。
负数,你就依次递减吧。
数字 0 的补码是:0000 0000。
数字-1 的补码是:0000 0000-1=1111 1111。(=255)
数字-2 的补码是:1111 1110。(=254)
。。。依次递减。。。
数字-128 的补码,就是:1000 0000。(=128)
----
由此可推出补码的定义:
零和正数的补码,就是该数字本身。
负数的补码,就是:256 + 该负数。
----
这就是:计算机中,正负数的存放格式。
其他说法如:原码反码符号位,都是人为瞎编的。
它们和计算机,没有任何关系。
在计算机中,整数,一律采用补码表示。
原码和反码,在计算机中,都是不用的。
没用的东西,你只能写在黑板上、纸面上,你怎么表示都行。
根本就不存在的东西,你想怎么表示就怎么表示。
原码表示:将符号位数码化了的数,其中“+”用0表示,“-”用1表示。
反码表示:正数的反码表示与原码表示一样;负数的反码表示是原码表示的符号位不变,数值位逐位取反。
补码表示:正数的补码表示与原码表示一样;负数的补码表示是原码表示的符号位不变,数值位逐位取反后最低位加1(反码表示最低位加1)。
例:
[+63]原=0111111
[+63]反=0111111
[+63]补=0111111
[-63]原=1111111
[-63]反=1000000
[-63]补=1000001
计算机运算基础二数的补码表示法
二、 数的补码表示法
数的正负号用 0和1表示,使正负号和数值全部数字化了。既然如此,能否将正负号和数值放在一起进行运算,而不因正负号的不同分别处理呢?为此,提出计算机数的补码表示法。数据的这种表示形式大大地简化了运算的处理过程。
那么什么是补码呢?我们先看一个例子,假定现在时钟上的读数是 10点钟,问4小时之前是几点钟?即时钟上的读数是什么。答案是显而易见的,为:10 - 4 = 10 +(- 4)= 6(点)。但是,这完全可以换一种算法得到同样的结果:10 + 8 = 18(点)。显然,18(点)在时钟刻度盘上的读数是6(点)。常识告诉我们,时钟只能表示到12,超过12时就把12丢掉,再从0开始,即到达12时又复位为0 。上式中的8是 12 - 4的结果;也即4是相对于12 的"补数"。因此,上式可表示为取模运算: 10 - 4 = (10 + 8 )Mod (12) = 6 。
( 1)数的原码表示:原码是最简单的计算机数表示法。
对正数,符号位 = 0 ,数值位 = 数的绝对值。+0100101 的原码为:00100101
对负数,符号位 = 1 ,数值位 = 数的绝对值。
- 0100101 的原码为:10100101
- 10100101=10000000( 2 7 ) - (- 0100101) = 100000000 + 0100101 = 10100101
原码的生成公式为:
( 2)数的反码表示:
对正数:同原码表示 。如, +0100101 表示为00100101。
对负数,先将其表示为绝对值(正数)的原码,然后将每一位的数变反,即 0变为1,1变为0 。如,- 0100101 的反码是:先表示为00100101 ,取反后为11011010。这个结果恰相当于计算11111111 ( 2 8 - 1 ) + (- 00100101) = 11111111 - 00100101 = 11011010。
反码的生成公式为:
( 3)数的补码表示
对正数,同原码表示 。如, +0100101 表示为00100101。对负数,先将其表示为反码,然后在该反码的最低位加“1”,即得到它的补码 。
如, - 0100101 先将其表示为反码为11011010 ,再在最低位加“1”得补码为11011011。这个结果恰相当于计算
100000000( 2 8 )+(-00100101) = 11011011
补码的生成公式为:
补码(计算机中数字的表示方式)
补码,其实,这就是一个“代替负数”的正数。
使用了补码(正数)之后,在计算机中,就没有负数了。
而且,在计算机中,也就没有减法运算了。
所以,利用补码,就能够把加减法,统一为加法运算。
使用补码的目的,就是:简化计算机的硬件。
---------------------
补码(一个正数),怎么就能代替负数呢?
你看时针,倒拨 3 小时,可以用“正拨 9 小时”代替吧?
你看三角函数,-π/2、+3π/2,两者函数值也是相等的吧。
如果限定,只用 2 位 10 进制数,那么会有:
25 - 1 = 24
25 + 99 = (一百) 24
如果你忽略进位一百(10^2),+99 就可以代替-1。
上面所说的这些“正数”,就是“负数的补数”。
求补数的公式是: 补数(即正数)= 负数 + 周期。
而正数,不用变换,也不允许变换。必须直接参加运算。
所以,正数,它就没有补数。
---------------------
计算机用二进制,那就称为补码了。
8 位 2 进制,周期是:2^8 = 256。
-1 的补码,是:-1 + 256 = 255 = 1111 1111(二进制)。
-2 的补码,是:254 = 1111 1110。
。。。
-128 的补码是:128 = 1000 0000。
补码的定义式,书上也有的:
X >= 0, [ X ]补 = X; 零和正数不用变换。
X < 0, [ X ]补 = X + 2^n。 n 是补码的位数。
---------------------
按照公式求补码,是极为简便的,而且还能理解补码的意义。
那么,就不需要学“原码反码取反加一符号位不变”吧?
但是,那些数学不好的老外,只能弄这些“隔路”的花样。
???????在计算机中,使用二进制表达数字,例如,一个字节(8位)可表示的范围是0到255(在不考虑符号的情况下),即00000000到11111111。 考虑到数字有正负,我们第一时间想到,空出一位来表示符号位,例如0表示正,1表示负。则理论上我们表示的范围是-127到+127。这种表达 方式简单明了,好理解,但是有如下几个缺点:
在介绍补码之前,我们先来看看几个相关的概念,第一个就是原码
以一个字节为例,例如:
原码表示有简单易懂的优点,但是原码的符号位不能直接参与运算,必须和其他位分开,这就增加了硬件的开销和复杂性。
上面是百度百科的定义和反码的计算方式,我们可以以一种简单的方式概括为:
一个数的反码为这个数的绝对值各位取反
反码码是数值存储的一种,多应用于系统环境设置,如linux平台的目录和文件的默认权限的设置umask,就是使用反码原理。
来到这边文章的重点了,在计算机里面,定点数既不是使用原码表示,也不是使用反码表示,而是使用 补码 百科解释如下
首先,我们阐述下补码的计算方式
例如
补码的特性
以-11举例 -11 原码为 10001011 -11 补码为 11110101
相加为10000000(高位溢出)=128,这个128即为8位定点数的模
这个也是补码的优势之一,原码和补码的转换,可以使用同一套规则,我们以一个负数为例 -11的原码为10001011 通过补码的规则转为之后为11110101,此为-11的补码 该补码再通过相同的规则转换为(11110101的反码加1),10001011
在原码里面,+0和-0的表示方式不同,运算和表达的时候需要增加一些额外的逻辑,在补码里面则没有这个烦恼,补码的+0和-0的表示方式均为00000000(以8位为例)
这也是补码的优势之一,这样可以简化电路逻辑,我们这里面举个简单的例子
11+(-2) 11的补码为00001011 -2的补码为11111110
直接相加加过为00001001=9
补码只是一种相对合理的编码方案。这个方案在负数的机器表示中解决了3个问题:
百度百科 阮一峰博客
补码是什么意思?
补码
用[x]表示机器数(原码),x是真值(二进制)
x=+0.1001,则[x]原=0.1001
x=-0.1001,则[x]原=1.1001
对于0,原码中有“+0”、“-0”之分,故有两种形式:
[+0]原=0.000...0
[-0]原=1.000...0
采用原码表示法简单易懂,但它的最大缺点是加法运算复杂。这是因为,当两数相加时,如果是同号则数值相加;如果是异号,则要进行减法。而在进行减法时还要比较绝对值的大小,然后大数减去小数,最后还要给结果选择符号。
为了解决这些矛盾,人们找到了补码表示法。机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。
负数用补码表示时,可以把减法转化为加法。这样,在计算机中实现起来就比较方便
[x]补=
{
x
1>x≥0
{
2+x=2-|x|
0≥x≥-1
x=+0.1011,则[x]补=0.1011
x=-0.1011,则[x]补=10+x=10.0000-0.1011=1.0101
对于0,[+0]补=[-0]补=0.0000
(mod
2)
例子中是以定点小数为例。
补码的原理可以用钟表来描述
如设标准时间为4点正;一只表已经7点了,为了校准时间,可以采用两种方法:一是将时针退
7-4=3
格;一是将时针向前拨12-3=9格。即7-3和7+9(mod12)等价,因此,把负数用补码表示的mod2操作,可以把减法转化为加法。
1
补码
注意:此处的'=='是相等的意思。'='是赋值的意思。
在机器世界里:
正数的最高位是符号位0,负数的最高位是符号位1。
对于正数:反码==补码==原码。
对于负数:反码==除符号位以外的各位取反。
补码==反码+1.
原码==补码-1后的反码==补码的反码+1。(读完本文后,应该能够直观地认识到本式的正确性)
可以轻易发现如下规律:
自然计算 :a-b==c.
计算机计算:a-b==a+b的补码==d.
c的补码是d.
通过此法,可以把减法运算转换为加法运算。
所以补码的设计目的是:
1.使符号位能与有效值部分一起参加运算,从而简化运算规则.
2.减运算转换为加运算,进一步简化计算机中运算器的线路设计.
钟表分针,你正拨 59 分,就相当于,倒拨 1 分钟。
就是说:
-1,可以用+59 代替;
-2,可以用+58 代替;
-3,可以用+57 代替;
……
59、58、57...,就是-1、-2、-3...的补数。
算法就是:[ X ]补 = 60-| X |, 其中的 60,就是“计数周期”。
----------------------------
在计算机中,一个字节,是 8 位 2 进制数。
其数字是:0~255,都是正数。
其计数周期,就是 2^8 = 256。
它们,怎么表示负数呢?
-1,可以用+255 代替;
-2,可以用+254 代替;
-3,可以用+253 代替;
……
-128,就用+128 代替。
以上的 255~128,就是负数(-1~-128)的补码。
而 0 ~ 127,还是照常代表零和正数。也有人叫补码。
----------------------------
因此,可导出 8 位 2 进制数补码的定义式,如下:
正数和零: [ X ]补 = X,
负数: [ X ]补 = 256-| X |。
这里的 256=2^8,是 8 位 2 进制的“计数周期”。
看看计算机方面的书吧,肯定能找到这个定义式。
不要迷信“取反加一”了。
取反加一,说明不了“加法代替减法”!
负数,存放在计算机中,就称为:补码。
--------------
时钟的时针,周期是 12 小时。
倒拨 3 小时,也可以用正拨 9 小时来代替。
9,就是-3 的补数。 补数=周期+负数。
分针倒拨 X 分,也可用正拨 60-X 代替。
60,是周期。
--------------
如果使用两位十进制数 0~99,共 100 个数,周期就是一百。
减一,就可以用 +99 代替:
28 - 1 = 27
28 + 99 = (1) 27
忽略进位(一百),两种算法的结果,就是相同的。
于是,99,就是-1 的补数;
同理,98,就是-2 的补数;
利用【补数】,就可把“负数”改为“正数”。
利用【补数】,就可把“相减”运算,改为“相加”。
求-1 【补数】的计算方法是:
周期 + 负数 = 100 - 1 = 99。
其他负数,也可用此公式计算。
-------------
计算机中,没有数字。 1 和 0,都是代码。
八位二进制,称为一个字节。
0000 0000~1111 1111,共 256 个代码。
对应的十进制是:0~255。 周期就是 256。
-1,就可以用 255 = 1111 1111 (二进制) 代替,
-2,就可以用 254 = 1111 1110 (二进制) 代替,
那么,1111 1111 就称为-1 的补码;
同理,1111 1110 也就是-2 的补码。
。。。
补码的定义式,如下:
负数的补码,就是:周期,加上该负数。
正数,没有补码。必须直接运算,不可变换。
求补码,并不涉及“原码反码符号位 ”这些垃圾知识。
原码反码,在计算机中,都是不存在的。
-------------
补码,有什么意义?
借助于补码,就能用加法,代替减法运算。
那么,计算机中,只需要有一个加法器即可。
这就简化了硬件。
原码和反码,并没有这种功能。
所以,计算机中,只是使用补码。
原码反码,在计算机中,都不存在,根本就不需要讨论。
原码,反码,补码,是什么?
所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
原码10010= 反码11101 (10010,1为符号码,故为负)
(11101) 二进制= -13 十进制
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
以上答案来自百科
这种计算机方面的概念听起来可能稍微难以理解
你可以只去记住原码,补码和反码的转换方法~
带符号数,有三种表示方法,即:原码、反码和补码。
但是,在计算机系统中,数值一律用【补码】来表示和存储。
所以,在计算机系统中,原码和反码,都是不存在的。
使用补码的意义:可以把减法或负数,转换为加法运算。
因此,就能简化计算机的硬件。
=====================
补码的概念,来自于:补数。
比如钟表,时针转一圈,周期是 12 小时。
那么,倒拨 3 小时,可以用正拨 9 小时代替。
9,就是-3 的补数。 计算方法: 9 = 12-3。
同理,分针倒拨 X 分,可以用正拨(60-X) 代替。
60,是分针的周期。
同理,三角函数的周期是 2π。 那么,
在-π/2 处 的函数值,就与 2π-π/2 = +3π/2 处 相同。
------------
当你使用两位十进制数:0~99,周期就是 一百。
那么,减一,就可以用 +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 + 这个负数 】。
(式中的 256 = 2^8,是八位二进制的周期。)
正数,直接运算就可以,并不存在补码的问题。
所以,正数,并不用求补码。
(也有人乱说:正数本身就是补码。)
------------
求解算式: 7-3 = 4。
计算机中,并没有减法器,必须改用补码相加。
列竖式如下:
7 的补码=0000 0111
-3的补码=1111 1101
--相加-------------
得: (1) 0000 0100 = 4 的补码
舍弃进位,只保留八位,结果完全正确。
------------
借助于补码,可以简化计算机的硬件。
原码和反码,并没有这种功能。
所以,在计算机中,根本就没有它们。
它们都是什么? 就不用关心了。
如何求补码
首先应确定,补码的位数。
再看下图,即可找到方法。
回答问题之前先让我们来了解一下:
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1 (即在反码的基础上+1)。
因此我们在求一个数的补码之前,应当先求出这个数的原码。
将一个数转化为二进制数,既是它的源码。可通过除二求余法算得(既对一个数除二求余,这会得出一个数和一个余数,再对得出来的数进行求余,得出余数,以此类推,最后将余数倒写即可)。
如是一个正数,它的补码与它的原码相同;如果是一个负数,它的补码是在它的原码的基础上,开头符号位不变,其余各位取反,最后再在其上面+1(既在反码的基础上+1)。
补码和反码的正负分别怎么表示?
反码的表示方法是:
正数的反码与其原码相同。
负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
补码的表示方法是:
正数的补码与其原码相同。
负数的补码是在其原码的基础上,符号位不变,其余各位取反, 最后+1 (即在反码的基础上+1)。
原码就是符号位加上真值的绝对值,,即用第一位表示符号,其余位表示值.。
计算机中,只是使用补码。原码和反码,都不存在,就不讨论了。
计算机中的补码,属于机器数。
机器数,只有 10,没有正负号,所以,它们都是正数。
但是,它们可以代表数字、字母、符号、控制信息。。。
n 位的补码,共有 2^n 组,是用来【代表】正负数的。
注意:是“代表”,不是说它们“就是”!
前一半,是用来【代表零和正数】的。
后一半,就是用来【代表负数】。
八位的话
原码:正00000000
负10000000
反码:正00000000
负11111111
补码:正00000000
负00000000
移码:正10000000
负10000000
移码就是符号位取反的补码
原码、补码、反码、移码、阶码表示法
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
“移码”是用来表示浮点型小数的阶码。对于正数,符号位为”1〃,其余位不变(+1110001->11110001);对于负数,符号位为”0〃,其余位取反,最后加”1〃
在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码,阶码指明了小数点在数据中的位置
由于正数的原码、补码、反码表示方法均相同,不需转换
负数
原码变补码,〔符号位不变,各数值位取反后最低位加1〕
补码变原码,〔符号位不变,各数值位取反后最低位加1〕
原码和移码的变换,相应的移码就是把补码的首位取反。
8位二进制原码的表示范围:-127~+127
8位二进制反码的表示范围:-127~+127
8位二进制补码的表示范围:-128~+127
原码表示法,将出现 0有两种表示
在计算机中,数据是以补码的形式存储的
二进制补码的表示方法
??二进制二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。??计算机中的二进制当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用1来表示“开”,0来表示“关”。??真值为正时真值为正时,其原码、反码、补码完全相同。??真值为负时真值为负时,其原码就是把负号改为1,其余不变。反码就是负号改为1,其余取反。补码就是在反码的基础上加1,加1时记得是逢2进1。??补码的表示方法负数的补码是将原码符号位保持“1”之后,其余各位按位取反,末位再加1便得到补码,即取其原码的反码再加“1”。