数据在计算机中的表示 原码、反码、补码
- 格式:doc
- 大小:85.50 KB
- 文档页数:4
补码原码反码数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是副。
以下都以8位整数为例,原码就是这个数本身的二进制形式。
例如0000001 就是+11000001 就是-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 //负数时,补码为原码取反+10.1101原码:0.1101反码:0.1101 //正数时,反码=原码补码:0.1101 //正数时,补码=原码-0.1101原码:1.1101反码:1.0010 //负数时,反码为原码取反补码:1.0011 //负数时,补码为原码取反+1在计算机内,定点数有3种表示法:原码、反码和补码所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
补码补码补码(two's complement) 1、在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。
另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
补码概述求给定数值的补码表示分以下两种情况:(1)正数的补码与原码相同。
【例1】+9的补码是00001001。
(备注:这个+9的补码说的是用8位的2进制来表示补码的,补码表示方式很多,还有16位2进制补码表示形式,以及32位2进制补码表示形式等。
)(2)负数的补码负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。
同一个数字在不同的补码表示形式里头,是不同的。
比方说-15的补码,在8位2进制里头是11110001,然而在16位2进制补码表示的情况下,就成了1111111111110001。
在这篇补码概述里头涉及的补码转换默认了把一个数转换成8位2进制的补码形式,每一种补码表示形式都只能表示有限的数字。
【例2】求-7的补码。
因为给定数是负数,则符号位为“1”。
后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001)所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:(1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
(2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
再举一个例子:求-64的补码+64:0100000011000000【例3】已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;再加1,所以是10000111。
在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。
计算机数据处理基础计算机数据处理是指将原始数据经过一系列操作和转换,以达到整理、存储、检索、分析和呈现等目的的过程。
在现代社会中,计算机数据处理已经成为各行各业的核心工作之一。
本文将介绍计算机数据处理的基础知识,包括数据的表示与存储、数据的转换与操作以及数据的分析与应用等内容。
一、数据的表示与存储在计算机中,数据以二进制形式表示和存储。
计算机使用二进制数字0和1来表示各种信息,包括文字、图像、视频、音频等。
数据的表示方式包括原码、反码和补码等。
原码是最简单的表示方法,即用二进制数直接表示数据的数值。
反码是对原码取反得到的表示方法。
补码是对反码加1得到的表示方法。
计算机内存是用来存储数据的地方。
内存通常被分为字节(Byte)、字(Word)和位(Bit)等不同的单位。
每个字节由8个位组成,每个字由若干个字节组成。
计算机使用地址来寻址内存中的数据,每个地址对应一个存储单元。
二、数据的转换与操作为了方便对数据进行处理和运算,计算机需要进行数据的转换和操作。
常见的数据转换包括进制转换和字符编码转换。
进制转换是将数据从一种进制表示转换为另一种进制表示的过程。
常见的进制包括二进制、八进制、十进制和十六进制等。
计算机内部使用二进制进行运算,但在实际应用中,常常需要将数据以其他进制表示,如十进制表示金额、十六进制表示颜色等。
字符编码转换是将字符从一个编码系统转换为另一个编码系统的过程。
不同的编码系统使用不同的编码方式表示字符。
常见的字符编码包括ASCII编码、Unicode编码和UTF-8编码等。
ASCII编码是最早的字符编码,用一个字节表示一个字符。
Unicode编码是全球范围内通用的字符编码,用两个字节表示一个字符。
UTF-8编码是Unicode的一种变长编码方式,可以根据字符的不同自动选择使用1到4个字节进行表示。
数据的操作包括常见的逻辑操作、算术操作和位操作等。
逻辑操作包括与、或、非和异或等。
算术操作包括加、减、乘和除等。
计算机基础--原码、反码、补码声明:以下⼆进制数据都是指⼋⽐特位长度的⼆进制数;以下⼗进制数都是指的整数。
1、什么是原码?我们来看⼀下百度百科的定义:原码(true form)是⼀种计算机中对数字的⼆进制定点表⽰⽅法;原码表⽰法在数值前⾯增加了⼀位符号位(即最⾼位为符号位):正数该位为0,负数该位为1,其余位表⽰数值的⼤⼩。
举个例⼦:100的源码怎么表⽰?--答案是:0 110 0100-100的源码怎么表⽰?--答案是:1 110 0100此外,还要注意⼀点:百度百科中看到⼀句话:原码不能直接参加运算,可能会出错。
他举出⼀个例⼦:在数学中 1+(-1)=0;但是⽤⼆进制进⾏计算的时候就会变成:0000 0001+1000 0001=1000 0010,换算成⼗进制是 -2。
显然结果是错误的。
2、什么是反码?反码通常是⽤来由原码求补码、或者由补码求原码的过渡码。
那么同⼀个数的反码与原码的对应关系是什么呢?反码跟原码是正数时,⼀样;负数时,反码就是原码符号位除外,其他位按位取反。
举个例⼦:100的原码是?0 110 0100100的反码是?0 110 0100========-100的原码是?1 110 0100-100的反码是?1 001 1011从上⾯的例⼦来看I、想知道⼀个⼗进制数的⼆进制反码表⽰形式,得先知道这个⼗进制数的原码。
也就是说,原码虽然简单,但却⾮常重要。
II、原码、反码都是数值在计算机中的表⽰⽅法,他们俩⾸位都表⽰符号位,即1为负、0为正;其余的为数值位。
原码的数值位的值就是所表⽰数的真值。
反码的数值位的意义我们不去深究。
3、什么是补码?在了解什么是原码的时候,我们就发现了原码在⼆进制加减运算中存在问题。
所以,计算机系统,数值⼀律采⽤补码来表⽰和存储。
原因是,补码能够将符号位和数值位统⼀处理;同时,减法和加法也可以统⼀处理。
这个例⼦解释了以n值为模的系统⾥,减法问题如何转化成加法问题的--把减数⽤相应的补数表⽰就可以了。
原码:将一个整数,转换成二进制,就是其原码。
如单字节的5的原码为:0000 0101;-5的原码为1000 0101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。
如单字节的5的反码为:0000 0101;-5的反码为1111 1010。
补码:正数的补码就是其原码;负数的反码+1就是补码。
如单字节的5的补码为:0000 0101;-5的原码为1111 1011。
在计算机中,正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。
负数用补码表示,如单字节-5,在计算机中表示为1111 1011。
这儿就有一个问题,为什么在计算机中,负数用补码表示呢?为什么不直接用原码表示?如单字节-5:1000 0101。
我想从软件上考虑,原因有两个1、表示范围拿单字节整数来说,无符号型,其表示范围是[0,255],总共表示了256个数据。
有符号型,其表示范围是[-128,127]。
先看无符号,0表示为0000 0000,255表示为1111 1111,刚好满足了要求,可以表示256个数据。
再看有符号的,若是用原码表示,0表示为0000 000。
因为咱们有符号,所以应该也有个负0(虽然它还是0):1000 0000。
那我们看看这样还能够满足我们的要求,表示256个数据么?正数,没问题,127是0111 1111,1是0000 0001,当然其它的应该也没有问题。
负数呢,-1是1000 0001,那么把负号去掉,最大的数是111 1111,也就是127,所以负数中最小能表示的数据是-127。
这样似乎不太对劲,该如何去表示-128?貌似直接用原码无法表示,而我们却有两个0。
如果我们把其中的一个0指定为-128,不行么?这也是一个想法,不过有两个问题:一是它与-127的跨度过大;二是在用硬件进行运算时不方便。
所以,计算机中,负数是采用补码表示。
如单字节-1,原码为1000 0001,反码为1111 1110,补码为1111 1111,计算机中的单字节-1就表示为1111 1111。
原码、反码、补码⼀、什么是原码、反码、补码原码:将⼀个整数,转换成⼆进制,就是其原码。
如单字节的5的原码为:0000 0101;-5的原码为1000 0101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每⼀位取反。
如单字节的5的反码为:0000 0101;-5的反码为1111 1010。
补码:正数的补码就是其原码;负数的反码+1就是补码。
如单字节的5的补码为:0000 0101;-5的补码为1111 1011。
⼆、为什么要有这三类码计算机只能识别0和1,使⽤的是⼆进制。
⽽在⽇常⽣活中⼈们使⽤的是⼗进制,并且我们⽤的数值有正负之分。
于是在计算机中就⽤⼀个数的最⾼位存放符号(0为正,1为负)。
这就是机器数的原码了。
有了数值的表⽰⽅法就可以对数进⾏算术运算,但是很快就发现⽤带符号位的原码进⾏乘除运算时结果正确,⽽在加减运算的时候就出现了问题,如下:假设字长为8bits(1) 10 - (1)10 = (1)10 + (-1)10 = (0)10(0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 ) 显然不正确。
因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数⾝上。
对除符号位外的其余各位逐位取反就产⽣了反码。
反码的取值空间和原码相同且⼀⼀对应。
下⾯是反码的减法运算:(1)10 - (1)10 = (1)10 + (-1)10= (0)10(0 0000001)反 + (1 1111110)反 = (1 1111111)反 = ( -0 ) 有问题。
(1)10 - (2)10 = (1)10 + (-2)10 = (-1)10(0 0000001)反 + (1 1111101)反 = (11111110)反 = (-1) 正确。
问题出现在(+0)和(-0)上,在⼈们的计算概念中零是没有正负之分的。
(印度⼈⾸先将零作为标记并放⼊运算之中,包含有零号的印度数学和⼗进制计数对⼈类⽂明的贡献极⼤)。
原码、反码和补码的数值范围,溢出的判断方法原码、反码和补码是计算机中常用的三种表示数值的方式。
它们的数值范围、溢出的判断方法和优缺点如下:
1. 数值范围:
- 原码(的最低正整数位为1,最高正整数位为7):原码表示的整数范围从-32768到32767。
- 反码(的最高正整数位为1,最低正整数位为7):反码表示的整数范围从-128到127。
- 补码(的最高正整数位为1,最低正整数位为0):补码表示的整数范围从0到65535。
需要注意的是,在计算机中,原码、反码和补码都是对整数进行操作的,但它们之间还存在一些差异。
例如,在二进制表示中,一个数的最高位是1并不意味着它的值就是1,而是表示它是负数。
因此,在进行溢出判断时,需要考虑原码、反码和补码之间的这种差异。
2. 溢出的判断方法:
- 原码的溢出判断方法:当原码的的最低正整数位为1时,表示该数已经超出了原码的数值范围,因此需要进行溢出判断。
可以使用以下公式来判断:
$n < 0 lor (n + 7) > 32767$
- 反码的溢出判断方法:当反码的最高正整数位为1时,表示该数已经超出了反码的数值范围,因此需要进行溢出判断。
可以使用以下公式来判断:
$n < -128 lor (n + 7) > 127$
- 补码的溢出判断方法:当补码的最高正整数位为1时,表示该数已经超出
了补码的数值范围,因此需要进行溢出判断。
计算机中带符号数的表示之原码、补码、反码计算机中带符号数的表示之原码、补码、反码2010-09-13 12:47为叙述方便,先引进两个名词:机器数和真值。
将一个数在机器中的表示形式,即编码称为机器数,将数本身称为真值。
常用的机器数有三种:原码、补码和反码。
1.原码1)通俗定义将数的符号数码化,即用一个二进制位表示符号:对正数,该位取0,对负数,该位取1。
而数值部分保持数的原有形式(有时需要在高位部分添几个0)。
这样所得结果为该数的原码表示。
例,x=+1001010,y=-1001010,z=-1110(=-0001110)。
当原码为8位时,x、y和z的原码分别是:[x]原=01001010;[y]原=11001010;[Z]原=10001110.其中最高位为符号位。
2)正规定义其中,x为真值,n为原码的位数。
这个定义实际是将真值的范围给出来了,当n=8时,-127 x127,因而,其数值部分写成二进制形式,最多为7位。
从该定义可看出,x为正数时,其原码还是数本身,第8位(符号位)补0;x为负数时,-x等于去掉负号,但要加上127,即第8位为1(127=10000000(2))。
因此,这个定义和上面的通俗定义是一致的。
3)原码表示的特点原码表示有三个主要特点:一是直观,与真值转换很方便;二是进行乘、除运算方便;三是加、减运算比较麻烦。
第一点是显然的。
说原码表示进行乘、除运算方便是因为其数值部分保持了数据的原有形式,对数值部分进行乘或除就可得到积或商的数值部分,而积或商的符号位可由两个数原码的符号位进行逻辑运算而得到。
说原码表示进行加、减运算比较麻烦,以加法为例,两个数相加需先判别符号位,若其不同,实际要做减法,这时需再判断绝对值的大小,用绝对值大的数减绝对值小的数,最后还要决定结果的符号位。
2.补码1)补码的引进和定义据统计,在所有的运算中,加、减运算要占到80%以上,因此,能否方便地进行正、负数加、减运算,直接关系到计算机的运行效率。
反码在计算机内,定点数有3种表示法:原码、反码和补码。
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
1、原码、反码和补码的表示方法(1)原码:在数值前直接加一符号位的表示法。
例如:符号位数值位[+7]原= 0 0000111 B[-7]原= 1 0000111 B注意:a. 数0的原码有两种形式: [+0]原=00000000B [-0]原=10000000Bb. 8位二进制原码的表示范围:-127~+127(2)反码:正数:正数的反码与原码相同。
负数:负数的反码,符号位为“1”,数值部分按位取反。
例如:符号位数值位[+7]反= 0 0000111 B[-7]反=1 1111000B注意:a.数0的反码也有两种形式,即 [+0]反=00000000B[- 0]反=11111111Bb. 8位二进制反码的表示范围:-127~+127(3)补码的表示方法1)模的概念:把一个计量单位称之为模或模数。
例如,时钟是以12进制进行计数循环的,即以12为模。
在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。
14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。
从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=-10+12=2)。
一、概述大家都知道,一个十进制数在计算机中都是以二进制数的形式存储的。
十进制数是有正负之分的,那么如何在计算机中来表示正号和负号呢?我们通常使用二进制数的最高位来表示数的符号:“0”来表示正号,“1”来表示负号。
在计算机中整型数值数据的编码主要有:z原码z反码z补码在开始讲述这三种编码方法前,我们首先介绍一下机器数、真值、模数的概念。
1.机器数数(含符号)在机器中的编码表示。
2.真值机器数所对应的真实数值。
3.模数一个计量器的容量或与零等价的数。
z对于一个n位计数器,每1位有R种状态,每种状态代表1个数,从“0”开始计数。
z计数器所能计的数值的个数即模数。
z计数器的模数 = 计数器的最大值+1 。
z计数器的模数(R n)取决于基数(R)和位数(n)例子01 2位十进制计数器的模数是多少?解:R=10 n=2 模数=R n = 102 = 99(最大的2位十进制数)+1 = 100 例子02 8位二进制计数器的模数是多少?解:R=2 n=8 模数=R n = 28 = 255(最大的8位二进制数)+1 = 2564. 为什么使用编码来表示“数”?为了方便计算机的处理,简化计算过程。
二、原码1. 定义022011≤<−−<≤−−XX X n n 21−X n =原][X其中:n 为二进制的位数原码的表示范围: )12(~)12(11−−−−−n n 问题:当n=8时,原码的表示范围是多少?请用十进制数表示。
2. 求原码的方法求原码的方法概括起来有两种z 根据定义求原码z 直接写出原码(1) 根据定义求原码例子03已知:a = +2 ,b = -2 ,根据定义求a ,b 的原码[ a ]原和[ b ]原。
设n = 8 。
解:根据公式有 [ a ]原 = a = (0000 0010)2[ b ]原 = 2 n-1 – b= 28-1 – ( -2) = 27+21000 0000+ 101000 0010(2) 直接写出原码这种方法跟我们书上一样,不再赘述。