原码反码补码的意义,原码,反码,补码各有什么作用呀
原码反码补码的意义,原码,反码,补码各有什么作用呀详细介绍
本文目录一览: 原码反码补码的意义
在计算机系统中,数值,一律采用补码表示和存储。
而在计算机中,原码和反码,都是不存在的。
原码反码的意义,就是垃圾。
问题一:原码、补码和反码的概念??? 数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是副。
以下都以8位整数为例,
原码就是这个数本身的二进制形式。
例如
0000001 就是+1
1000001 就是-1
正数的反码和补码都是和原码相同。
负数的反码是将其原码除符号位之外的各位求反
[-3]反=[10000011]反=11111100
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101
一个数和它的补码是可逆的。
为什么要设立补码呢?
第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补
第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)
有人会问
10000000这个补码表示的哪个数的补码呢?
其实这是一个规定,这个数表示的是-128
所以n位补码能表示的范围是
-2^(n-1)到2^(n-1)-1
比n位原码能表示的数多一个
又例:
1011
原码:01011
反码:01011 正数时,反码=原码
补码:01011 正数时,补码=原码
-1011
原码:11011
反码:10100 负数时,反码为原码取反
补码:10101 负数时,补码为原码取反+1
0.1101
原码:0.1101
反码:0.1101 正数时,反码=原码
补码:0.1101 正数时,补码=原码
-0.1101
原码:1.1101
反码:1.0010 负数时,反码为原码取反
补码:1.0011 负数时,补码为原码取反+1
总结:
在计算机内,定点数有3种表示法:原码、反码和补码
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
1、原码、反码和补码的表示方法
(1) 原码:在数值前直接加一符号位的表示法。
例如: 符号位 数值位
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
注意:a. 数0的原码有两种形式:
[+0]原=00000000B [-0]原=10000000B
b. 8位二进制原码的表示范围:-127~+127
2)反码:
正数:正数的反码与原码相同。
负数:负数的反码,符号位为“1”,数值部分按位取反。
......>>
问题二:补码与反码有什么用处? 在现在的计算机中,用补码表示有符号数,其计算方法,和无符号数的计算方法相同,所以可以共用一个运算器。
因此,在计算机里弧,通用的是补码。
原码和反码,都是用于求补码的中间过程,一般都是写在纸面上,并不存入计算机。
问题三:计算机的原码,反码,补码是怎么回事?可以举例说明吗? 计算机以二进制补码存储数据
以16位机器为例:
比如83的二进制码为:0000 0000 0101 0011
由于正数的源码、反吗、补码,上面的既是源码,也是反码和补码
下面通过负数讲解源码、反码、补码之间的关系
以-83为例
先求出-83绝对值的源码:0000 0000 0101 0011
计算机区分正负数通过判断最高位符号位,1为负数、0为正数
那么-83的源码为:1000 0000 0101 0011
反码在源码基础上按位取反,符号位不变:1111 1111 1010 1100
补码在反码的基础上加1:111场 1111 1010 1101
补码转源码:补码基础上按位取反后加一,符号位在取反时不变,加一时最高位符号位有进位的,进位忽略
取反:1000 0000 0101 0010
加1:1000 0000 0101 0011
问题四:原码,反码和补码表示的规则分别是什么 一. 机器数和真值
在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.
1、机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
那么,这里的 00000011 和 10000011 就是机器数。
2、真值
因
为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3
而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = C000 0001 = C1
二. 原码, 反码, 补码的基础概念和计算方法.
在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.
1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原码是人脑最容易理解和计算的表示方式.
2. 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
问题五:原码反码和补码区别 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值,如
[+1]原 = 0000 0001
[-1]原 = 1000 0001
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
正数的源码,反码,补码都一样
问题六:相对于原码和反码,补码表示法有什么优点和缺点 原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。
机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。
机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。
如果是为了考试,死记即可。但我总想搞清楚为什么计算机里面的数要这样子表达?意义何在?-128的补码为什么是10000000?为什么补码有这么奇怪的运算规则?计算机算减法的时候都需要从源码到补码的计算吗?
思路
google了一下,看到了这样一篇文章,注意到文中关于补码来历的描述,可以总结如下:
计算机里面,只有加法器,没有减法器,所有的减法运算,都必须用加法进行。
用补数代替原数,可把减法转变为加法。出现的进位就是模,此时的进位,就应该忽略不计。
二进制下,有多少位数参加运算,模就是在 1 的后面加上多少个 0。
补码就是按照这个要求来定义的:正数不变,负数即用模减去绝对值。
补充解释一下“模”的概念(不准确):
考虑时钟上时间的计算,假设现在时针指向数字3,若问“6小时前时针指向的数字是几”,则可以:
1. 将时针逆时针拨动6格。
2. 将时针顺时针拨动12 - 6 = 6格。
两者的结果是一样的。这里称12为“模”。
故有 3时 - 6个小时 = 3时 + (12 - 6个小时),这里可以看到将减法转换成加法的过程,即“加上模减去绝对值的差”。
所以,假设模是10,有效位数为1,当我们计算 9 - 7 的时候:
9 - 7 => 9 + (10 - 7) = 12,去掉最高的位后,得到2,这是正确的结果。
作者的意思是说,计算机里面所有数都以补码形式保存,加减运算都是补码之间的加法运算。然后作者提出了一个我之前没听过的观点:
补数 和 补码的定义式 里面,根本就没有什么符号位。这最高位的1、0是自然出现的,并不是由人来规定的。
的确,符号位在补码运算里面是“模”,本身并不带符号的意义。因为计算机将加法转换成加上一个“负数”,而负数又以补码的形式表现。补码比源码多一位,从这多出来的一位可以推断出原来数字的正负号,所以成为了符号位。也可以这样认为,留出一位(不全部占满)的原因是要用“模”来表示正负数。
也就是说,不是特意留出一个符号位,用1和0来表示正负号。而是补码运算可以用最高位来表示正负,所以符号位诞生了。
那么为什么-128的补码是10000000?可以这样理解。-128是一个负数,所以它的补码是它的“模”减去它的绝对值,即:
100000000 - 10000000 = 10000000
那么为什么负数补码等于源码的反码加一呢?可以这样推导:
100000000 - 10000000
= (11111111 + 00000001) - 10000000
= 11111111 - 10000000 + 1
= 01111111 + 1 反码加一
= 10000000
由此我们得知,在计算机里面所有的数字都以补码形式存储。127存成01111111,-127存成11111111,算减法就变成算加法了,尽管你看到的是“-”号。...>>
问题七:c语言中的原码,反码,补码有什么作用,是用来做什么的 计算机中的整数类都是用补码来存储的。
而C语言中不需要关心原反补码!
原码,反码,补码各有什么作用呀
正负数,在计算机中存放的格式,就是补码。
计算机中,并没有原码和反码,也就不必关心它们了。
下面,针对补码,给出解释。
比如,有一个小孩,很小的。
他只认识 100 个数(0~99),也不会做减法。
那么,就可以告诉他:“减一”,就用“加 99”算吧。
36 - 1 = 35
36 + 99 = (1) 35
忽略进位的 100,结果不是一样的吗?
那么,就是说:
99,就是-1 的补数。
98,就是-2 的补数。
。。。
利用“补数”,就可把“减法”转为“加法”。
利用这个特点,计算机中,仅需一个“加法器”,就够用了。
------------
在计算机中,是以二进制存放各种信息的,统称为:代码。
八位,作为一个计算单位。
范围是:0000 0000 ~ 1111 1111。
写成十进制,就是:0~255。
共有 256 个代码。--这个数字,称为:模。
那么:
1111 1111(255),就是-1 的补码。
1111 1110(254),就是-2 的补码。
。。。
1000 0000(128),就是-128 的补码。
求负数的补码,就是这么简单。
而零和正数,直接参加运算即可,用不着求补码。
因此,下面就是补码的定义式。
零和正数的补码: 就是该数字本身。
负数的补码: 就用“模”,加上该负数。
模,就是代码的总个数。
---------
原码和反码,则毫无意义。
所以,在计算机中,并没有它们的存在。
计算机中所使用的,是二进制数。
这些二进制数,可以代表:数字、英文字符、汉字、声音、图像等等。
8 位 2 进制的计数范围是:0000 0000~1111 1111。
对应的十进制是:0 ~ 255。
计数周期,则是:2^8 = 256。
这些二进制数字,都是正数。
实际上,正数,也可以代表负数的。
比如,
钟表的时针,正拨 9 小时,可以代表倒拨 3 小时。
算法是:+9 =-3 + 周期 12。
如果是分针,周期就应该是 60。
如果是 2 位 10 进制(0~99),计数周期就是 10^2 = 100。
此时,25 - 1 = 24,
25 + 99 = (一百) 24。
舍弃超出 2 位的进位,+99 就可以代表-1 进行运算。
算法是:正数=负数+周期 (10^2)。
这里的正数,可以称为:负数的补数。
-------------------------
同理,计算机中的正数,也可以代表负数。
算法仍然是:正数=负数+周期(2^8)。
这里的正数,就被称为:负数的补码。
-1 的补码就是 255 = 1111 1111 (二进制)。
-2 的补码就是 254 = 1111 1110 (二进制)。
。。。
而正数,本身就是正数,就不需要转换了。
因此,也可以说,正数,并没有补码。
采用了补码之后,在计算机中,就没有负数了,
而且,也就没有了减法运算。
因此,采用了补码,就可以简化计算机的硬件。
原码和反码,都没有这种功能。
所以,在计算机系统中,负数,一律采用补码表示和存储。
原码和反码,都是不存在的。
------------------------
符号位原码反码和取反加一,这些,都是没有任何用处的。
老外整出这些垃圾,数学不好的特点,可见一斑。
原码:可直观反映出数据的大小。
补码:将加减运算统一为加法运算。
反码:方便原码和补码的相互转换
原码,反码,补码什么意思
在计算机系统中,数值,一律用补码表示和存储。
数值、补码,是一一对应的,可以直接互相转换。
原码和反码,在计算机中,都是不存在的。它们并没有什么意思。
补码,实际上,是一个“代替负数”的正数。
比如: 时针,倒拨 3 小时,就可以用正拨 9 小时来代替。
其算法是: +9 = 12-3。 式中的 12,是时针的计数周期。
在计算机系统中,使用二进制,所以就用补码,代替负数进行运算。
那么,计算机中,就没有负数了,同样,也就没有减法运算了。
因此,计算机的硬件就得以简化。
这就是“使用补码”的意义。
什么是原码,反码,补码?
补码,其实,就是一个【代替负数进行运算】的正数。
用补码代替负数之后,计算机中,就不存在负数了。
随之而来的是,计算机中,也就没有减法运算了。
即:借助于补码,能够简化运算。也就可以简化硬件。
-------------------
补码(一个正数),怎么就能“代替负数”呢?
且看 2 位 10 进制的运算:
28 - 1 = 27
28 + 99 = (一百) 27
只要忽略进位(10^2),+99 和-1 的功能,就是相同的。
此时,就称 +99 是-1 的补数。
同理,+98 就是-2 的补数。
。。。
求补数的计算公式,你也可以推导出来:
补数 = 负数 + 10^n, n 是补数的位数。
--------------------------
计算机用二进制,补数,改称为:补码。
对于 8 位 2 进制来说,应按照如下公式来求补码:
计算公式: 补码= 负数 + 2^n, n 是补码的位数。
8 位 2 进制,总共可以构成 2^8 = 256 组补码。
其中,包括有 128 个负数的补码。
如下:
[-1]补 = 2^8-1 = 255 = 1111 1111 (二进制)。
[-2]补 = 2^8-2 = 254 = 1111 1110 (二进制)。
。。。
[-128]补 = 256-128 = 128 = 1000 0000。
正数,不可变换,必须直接参加运算。
所以,正数,不存在补码。
--------------------------
原码和反码,都没有简化硬件的功能。
所以,计算机中,只用补码,根本就不用原码和反码。
求补码,千万不要走“原码反码符号位取反加一”这条路。
否则,你就不会知道: 何? 为? 补? 码?
--------------------------
用八位补码计算:7-5 = 2。
7 = 0000 0111
[-5]补 = 1111 1011
--相加------------
(1) 0000 0010 = 2
进位,是超出 8 位的,舍弃即可。
由此次计算,也可以看到:
使用了补码,减法,就转换成了加法。
原码反码,都没有这种功能。
所以,计算机中,根本就没有它们的影子。
将一个数用二进制表示即原码。
正数反码即原码。负数反码为原码各位取反即(0变1,1变0)
正数补码即原码。负数补码即反码加一。
带符号数,有三种表示方法,即:原码、反码和补码。
但是,在计算机系统中,数值一律用【补码】来表示和存储。
所以,在计算机系统中,原码和反码,都是不存在的。
使用补码的意义:可以把减法或负数,转换为加法运算。
因此,就能简化计算机的硬件。
=====================
补码的概念,来自于:补数。
比如钟表,时针转一圈,周期是 12 小时。
那么,倒拨 3 小时,可以用正拨 9 小时代替。
9,就是-3 的补数。 计算方法: 9 = 12-3。
同理,分针倒拨 X 分,可以用正拨(60-X) 代替。
60,是分针的周期。
同理,三角函数的周期是 2π。 那么,
在-π/2 处,就与 +3π/2 处 的函数值相同。
算法: +3π/2 = 2π -π/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
舍弃进位,只保留八位,结果就完全正确。
------------
借助于补码,可以简化计算机的硬件。
原码和反码,都没有这种功能。
所以,在计算机中,根本就没有原码和反码。
求一个数的补码,也用不到它们。
它们都是什么? 管它呢!
原码、补码、反码
计算机中,并没有原码和反码,只是使用补码,代表正负数。
使用补码的意义:可以把减法或负数,转换为加法运算。从而简化计算机的硬件。
------------
比如钟表,时针转一圈,周期是 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代表负数。
计算机中使用的连同符号位一起数字化了的数称为机器数。因为第一位是符号位,所以机器数的形式值就不等于真正的数值。所以将带符号位的机器数对应的真正数值称为机器数的真值。
而原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各位取反。
补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(即在反码的基础上+1)
在计算机中,正数是直接用原码表示,负数用补码表示。
补码还原成真值的过程为:补码—>原码—>真值? ? ? ? [ X ] 原码?? = ? [ [ X ] 补码 ] 补码
若补码符号位为1,将其后的数值位按位取反加1,结果为真值且为负。
首先,根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1+(-1), 所以计算机被设计成只有加法而没有减法, 而让计算机辨别“符号位”会让计算机的基础电路设计变得十分复杂,于是就让符号位也参与运算,从而产生了反码。
用反码计算, 出现了“0”这个特殊的数值,0带符号是没有任何意义的。而且会有[0000 0000]和[1000 0000]两个编码表示0。于是设计了补码,负数的补码就是反码+1,正数的补码就是正数本身,从而解决了0的符号以及两个编码的问题:用[0000 0000]表示0,用[1000 0000]表示-128。
注意到:-128实际上是使用以前的-0的补码来表示的,所以-128并没有原码和反码。使用补码,不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数。这就是为什么8位二进制,使用补码表示的范围为[-128, 127]。
补码,原码,反码什么的。有什么作用啊!
在计算机系统中,数值,一律采用补码表示和存储。
在计算机中,原码和反码,根本就不存在。
不存在的东西,哪还有什么用呢?
这三个词是计算机里面的内容,下面依次解释:
原码:原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。
举例:
int类型的 3 的原码是 11B(B表示二进制位), 在32位机器上占四个字节,那么高位补零就得:
00000000 00000000 00000000 00000011
int类型的 -3 的绝对值的二进制位就是上面的 11B 展开后高位补零就得:
10000000 00000000 00000000 00000011
但是原码有几个缺点,零分两种 +0 和 -0 。很奇怪是吧!还有,在进行不同符号的加法运算或者同符号的减法运算的时候,不能直接判断出结果的正负。你需要将两个值的绝对值进行比较,然后进行加减操作 ,最后符号位由绝对值大的决定。于是反码就产生了。
反码:正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反
举例:
int类型的 3 的反码是
00000000 00000000 00000000 00000011
和原码一样没什么可说的
int类型的 -3 的反码是
11111111 11111111 11111111 11111100
除开符号位,所有位,取反
解决了加减运算的问题,但还是有正负零之分,然后就到补码了
补码:正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.
举例:
int类型的 3 的补码是:
00000000 00000000 00000000 00000011
int类型的 -3 的补码是
11111111 11111111 1111111 11111101
就是其反码加1
最后总结:
正数的反码和补码都与原码相同。
负数的反码为对该数的原码除符号位外各位取反。
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1。
扩展资料二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号"0''.''1''的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。
原码反码和补码的含义分别是什么?
在计算机系统中,数值,一律用补码表示和存储。
补码,就是一个代表负数参加运算的正数。
那么,负数,就是正数的运算,减法就可以用加法代替。
因此,利用了补码,计算机的硬件,就可以得到简化。
这就是补码存在的意义。
补码,怎么就能把减法转换成加法呢?
这可用 2 位 10 进制来说明:
24 - 1 = 23
24 + 99 = (一百) 23
如果,舍弃进位,只取 2 位数结果,+99 就能代替-1。减法,就能转化为加法运算。
+99,就称为-1 的补数。
+98,就是-2 的补数。
。。。
很容易就能导出公式:补数 = 负数 + 10^n,n 是位数。
位数限定了之后,正数,就可以当负数使用。
计算机所能计算的位数,都是固定的,如:八位机、16 位机。。。
那么,在计算机中,负数,就可以用正数(补码)代替。
求补码的公式:补码 = 负数 + 2^n, n = 8、16, 是位数。
原码和反码,都没有这样的能力。
所以,计算机中,并没有原码和反码。
它们有什么意义呢?
除了让计算机老师挣碗饭吃,什么意义都没有。
计算机中正数的存储就是存储它的原码,只有负数才是存储补码
1011的原码是1111110011,就是他的二进制数,别告诉我你二进制不会求..除基取余
有意义的是补码。可见:网页链接。
原码就是字符的ASCII码的2进制表示,反码就是原码的按位取反(除符号位)
补码就是反码加1(计算机一般都用反码)
原码、反码、补码的理解
在计算机系统中,数值,一律采用【补码】来表示和存储。
原码和反码,都是不用的。
所谓的【补码】,实际上,是一个“代替负数做运算”的正数。
因为,使用了正数(即补码)代替了负数,
所以,在计算机中,也就没有了减法运算。
那么,只需配置一个加法器,就可以走遍天下了。
而原码和反码,都没有这种功能。
所以,它们在计算机中,都是不存在的。
------------------
正数,怎么就能代替负数呢?
2 位 10 进制,数值范围是:0 ~ 99。
计数周期是:10^2 = 100。
那么,有:25 - 1 = 24
25 + 99 = (一百) 24
进位值,就是计数周期 100。
你只要舍弃进位,取 2 位数,+99 就可以代替-1 了。
同理,+98 也可以代替-2。
。。。
这些正数,就称为:负数的补数。
如果你用三位十进制数,-1 的补数就是 +999 了。
求补数的公式: 补数 = 负数 + 10^n。
------------------
计算机用二进制,补数,就改称为:补码。
8 位 2 进制数,计数周期是:2^8 = 256。
-1 的补码,就是:-1 + 256 = 255
= 1111 1111 (二进制)。
-2 的补码是:254 = 1111 1110。
。。。
-128 的补码是:128 = 1000 0000。
以上就是 128 个负数的补码。
正数,本身就是正数,必须直接参加运算,不可变换。
所以,正数,根本就没有补码。
------------------
举例,用补码计算:7 - 5 = 2。
7= 0000 0111
[-5]补 = 1111 1011
-相加------------
得: (1) 0000 0010 = 2
你只要舍弃进位,这就可以用加法,实现减法运算。
如果,你不舍弃进位呢?
那不就多出来一位吗!
那就不是用补码运算了。
进位 1,这就是 256。
这个算法,就是:7 + 251 = 258。
------------------
用公式来求补码,简单方便。而且,你还能理解“补码的意义”。
原码反码、取反加一、符号位,这些都是怎么回事?
老外数学不好,也就只能用这些笨办法了。
在二进制中数字采用原码来表达含义,但存储时确使用的是补码,而负数的补码又是通过反码计算得到的。
在计算机中采用二进制来表示数值,以最高位来表示符号位来表示数值的正负,0001表示十进制的1,1001则表示-1。
正数的反码就是原码
负数的反码是除符号位以外其余位数取反
正数的补码和反码一样都是原码
负数的补码是反码+1
以一个12小时表示的钟表为例,如果当前时间为4点,想要将钟表的时间调整到2点钟可以有两种方法。
第二种方法之所以能够使用这是因为钟表最高只能表示到12小时,而超过了这个阈值边会重置,这个12便可以成为模,而 (4+10) mod 12=2 这个过程就叫做取模
10和-2的余相等,可以看出在模为12的情况下-2与10是可以相互代替的。
在计算机中加法的运算远比减法要简单,因此就产生了通过加法来表示减法的方式。即1+(-1)=0这种方式。但是 0001+1001=1010=-2 而并非0。于是便产生了与调整钟表类似的,通过取模的方法来计算减法(不得不说想出这些方法的真是个人才)。
以4位二进制位例,由于最高位的二进制用来作为符号,实际上表示数的只有三位二进制 因此能表示的最大值是7,即模为7。 那么
由于二进制最高位为符号位,所以取模时不能当成数字计算,也就是前面提到的反码
但在这里我有了疑惑取反后1001实际上变成了-6而不是真正意义上的6。在思考后得出了自己的理解:由于计算机实际上是没有相减的运算存在的,自然也没有符号的概念,所以实际上运算时并没有正负数概念,正负概念是额外给出的定义。因此可以理解为
而反码则可以理解为
计算机存储使用的是补码,而负数的补码是在反码基础上在+1,有什么作用呢?
由于定义的特殊性所以存在着两个0即0000和1000,分别为+0和-0,那么1+0和1-0会怎么样呢
可以看出虽然+0没有问题但是-0却出现了计算上的错误。
而补码的出现就是用来弥补存在两个0的特殊性问题
在补码的情况下-0的反码转化成了10000而4位二进制最高只能存储4位数值,所以10000就会变成0000就像钟表拨过12点一样又会重新开始。而0000又恰好是0000也就是+0的补码这样一来在存储和计算时-0与+0就相等了。那么1000—1111的补码就是10000—1001,这样可以看出补码中1000并没有使用到
(-1)+(-7)是-8,而二进制(-1)+(-7)的补码是11000存储4位就是1000,因此正好可以使用多出的(-0)[1000]的位置来表示(-8)[11000],由于存储时的有溢出位的特殊性因此-8是没有反码和原码的。这样一来不仅解决了(-0)的计算问题,同时原本的表达范围(-7)—7也变成了(-8)—7,比原本的表达范围最小值多了一个数值。
这也是为什么在程序语言中数值数据类型的范围定义负数总是比正数多一个数值的原因了。
由于课堂上老师提到了补码,出于好奇,而且觉得还是需要掌握的,所以才查阅的。理解纯属个人观点,如有理解错误还请指出。
为什么要使用原码,反码,补码
原码、反码、补码,是机器数。
计算机内部的硬件电路较易实现用1(高电平)、0(低电平)表示数据的正、负,通常这个符号放在二进制数的最高位,称符号位。符号位与数值位共同参预运算。
机器数的记忆及运算,利于计算机硬件逻辑电路的设计与制造。
在计算机系统中,数值,一律采用补码表示和存储。
原码和反码,都是没有任何用处的。
补码的功能,类似于:
时针,倒拨 3 小时,可以用正拨 9 小时代替。
利用这种思路,计算机中的负数,也可以用正数(即补码)代替。
于是,计算机中,就没有负数了。
同时,减法运算,也都不存在了。
因此,借助于补码,就能统一加减法,从而简化计算机的硬件。
这就是使用补码的原因。
------------------------
在时钟中,时针转一圈,周期是 12。
正拨 9 代替倒拨 3,其算法是:9 = -3 + 周期 12。
分针,倒拨 X 分,也可用正拨(-X + 周期 60)代替。
在三角函数中,周期是 2π。
一个负角度,也能用周期,算出等效的正角度。
------------------------
在计算机中,8 位 2 进制,称为一个字节。
其计数周期是:2^8 = 256。
那么:
-1 的补码是:-1 + 256 = 255 = 1111 1111(二进制)。
-2 的补码是:-2 + 256 = 254 = 1111 1110(二进制)。
。。。
正数,则必须直接参加运算,不许作任何转换。
即:正数,不存在补码。
------------------------
补码,是从计数系统的周期性,推导出来的。
补码与“原码反码符号位”,并无半点关系。
由“取反加一”学习补码,就不会理解补码的作用和产生的原因。
那么,为什么要使用原码、反码、符号位?
老外数学不好,也就只能用这些乱七八糟的操作,来求补码了。