计算机原码、反码、补码、机器数、真值、有符号数、无符号数等的区分与运算
原码、反码、补码课件

160
二进制数相加
10000110 + 00011010
10100000
看成补码
-122
+
26
-96
出现问题
• 错误的结果:
11001011 10010001
01011100
-0110101 + -1101111
+1011100
-53 + -111
-+19624
思考:为什么出现了错误?
补码 • 溢出
补码 •补码的求法(1)
• 正数:与原码相同;
• 负数:“求反加一”
例:
x=+1001100B,则[x]补=01001100B=[x]原
x=-1001100B,则[x]补=10110100B
x=-1001100时, [x]补=28-1001100B
11111111 01001100
=256 -1001100B =255 -1001100B +1
溢出
图d 有进无出
补码 • 溢出的判别(3)
• 课堂练习
1、请判断下列8位补码的运算是否会产生溢出?
11001001 11100111
10110000
有进有出,无溢出
01100011 01001010
10101101
有进无出,溢出
补码小结
真值 机器数
无符号数 有符号数
原码 反码
真值的方法 已知[x]补,求[-x]补的方法 溢出
• 拨针方法小结: 8- 2=6
8 + 10 = 6 • 思考:为什么会出现这种现象?计算机中是否
也有这种现象? (表盘是圆的,可循环计时。)
计算机基础理论:原码、反码、补码、移码

计算机基础理论:原码、反码、补码、移码计算机基础理论:原码、反码、补码、移码(2009-04-23 00:02:36)对于正数,原码和反码,补码都是⼀样的,都是正数本⾝。
对于负数,原码是符号位为1,数值部分取X绝对值的⼆进制。
反码是符号位为1,其它位是原码取反。
补码是符号位为1,其它位是原码取反,未位加1。
也就是说,负数的补码是其反码未位加1。
移码就是将符号位取反的补码⼀、标准理论1、原码的定义①⼩数原码的定义[X]原 =X0≤X <11- X-1 < X ≤ 0例如: X=+0.1011 , [X]原= 01011X=-0.1011 [X]原= 11011②整数原码的定义[X]原 =X0≤X <2n2n-X- 2n < X ≤ 02、补码的定义①⼩数补码的定义[X]补 =X0≤X <12+ X-1 ≤ X < 0例如: X=+0.1011, [X]补= 01011X=-0.1011, [X]补= 10101②整数补码的定义[X]补 =X0≤X <2n2n+1+X- 2n ≤ X < 03、反码的定义①⼩数反码的定义[X]反 =X0≤X <12-2n-1-X-1 < X ≤ 0例如: X=+0.1011 [X]反= 01011X=-0.1011 [X]反= 10100②整数反码的定义[X]反 =X0≤X <2n2n+1-1-X- 2n< X ≤ 04.移码:移码只⽤于表⽰浮点数的阶码,所以只⽤于整数。
①移码的定义:设由1位符号位和n位数值位组成的阶码,则 [X]移=2n + X -2n≤X ≤ 2n 例如: X=+1011 [X]移=11011 符号位“1”表⽰正号X=-1011 [X]移=00101 符号位“0”表⽰负号②移码与补码的关系: [X]移与[X]补的关系是符号位互为反码,例如: X=+1011 [X]移=11011 [X]补=01011X=-1011 [X]移=00101 [X]补=10101③移码运算应注意的问题:◎对移码运算的结果需要加以修正,修正量为2n,即对结果的符号位取反后才是移码形式的正确结果。
计算机机器数的三种表示方法

计算机机器数的三种表示方法计算机中的机器数可以通过不同的表示方法来表示。
下面将介绍计算机机器数的三种常见表示方法:原码、反码和补码。
1. 原码表示法:原码是机器数的最简单表示方法。
原码的表示方法是将一个数值的绝对值转换为二进制表示,然后在最高位上加上符号位,0代表正数,1代表负数。
例如,对于十进制数-5,它的原码表示为10000101,其中最高位1表示负数,其余位表示数值的绝对值。
原码表示法的优点是简单明了,符号位和数值部分可以直接进行运算,但是它也存在一些问题。
首先,原码的加法运算需要分别对符号位和数值部分进行处理,不够高效。
其次,原码中存在两个零:+0和-0,导致运算结果不唯一。
2. 反码表示法:为了解决原码运算不方便的问题,人们引入了反码表示法。
在反码表示法中,正数的反码与原码相同,负数的反码是对原码符号位之后的数值部分按位取反。
例如,对于十进制数-5,它的反码表示为11111010,其中最高位1表示负数,其余位是对原码数值部分按位取反得到的。
反码表示法解决了原码运算的问题,可以直接对符号位和数值部分进行运算,但是它仍然存在一个问题:+0和-0的表示仍然不唯一。
3. 补码表示法:为了解决反码表示法的+0和-0不唯一的问题,人们引入了补码表示法。
在补码表示法中,正数的补码与原码相同,负数的补码是对原码符号位之后的数值部分按位取反,然后再加1。
例如,对于十进制数-5,它的补码表示为11111011,其中最高位1表示负数,其余位是对原码数值部分按位取反得到的,然后再加1。
补码表示法是计算机中最常用的表示方法。
它解决了原码和反码表示法中+0和-0不唯一的问题,同时还能够简化负数的加法运算。
在补码表示法中,正数和负数的加法运算可以统一处理,只需要进行简单的二进制加法即可。
总结:计算机中的机器数可以通过不同的表示方法来表示,其中包括原码、反码和补码。
原码是最简单的表示方法,直接将数值的绝对值转换为二进制表示,并在最高位上加上符号位。
原码、反码、补码的定义

原码、反码、补码的定义所有的负数的反码等于原码各位取反;补码等于反码加一.十六进制也是先化成2进制的在化补码。
补码的用途是让机器学会减法运算的。
应为所有的处理器是电路做的,电路其实只是加法器,只能做加法。
如何能让电脑做减法呢,就用补码啊。
减去一个数就等于加上她的补码。
一、原码、反码、补码的定义1、原码的定义①小数原码的定义[X]原=X 0≤X<1 1-X-1<X≤0例如:X=+0.1011,[X]原=01011 X=-0.1011[X]原=11011②整数原码的定义[X]原=X 0≤X<2n 2n-X-2n<X≤0 2、补码的定义①小数补码的定义[X]补=X 0≤X<1 2+X-1≤X<0例如:X=+0.1011,[X]补=01011 X=-0.1011,[X]补=10101②整数补码的定义[X]补=X 0≤X<2n 2n+1+X-2n≤X<0 3、反码的定义①小数反码的定义[X]反=X 0≤X<1 2-2n-1-X-1<X≤0例如:X=+0.1011[X]反=01011 X=-0.1011[X]反=10100②整数反码的定义[X]反=X 0≤X<2n 2n+1-1-X-2n<X≤0 4.移码:移码只用于表示浮点数的阶码,所以只用于整数。
①移码的定义:设由1位符号位和n位数值位组成的阶码,则[X]移=2n+X-2n≤X≤2n例如:X=+1011[X]移=11011符号位"1"表示正号X=-1011[X]移=00101符号位"0"表示负号②移码与补码的关系:[X]移与[X]补的关系是符号位互为反码,例如:X=+1011[X]移=11011[X]补=01011 X=-1011[X]移=00101[X]补=10101③移码运算应注意的问题:◎对移码运算的结果需要加以修正,修正量为2n,即对结果的符号位取反后才是移码形式的正确结果。
真值原码反码补码详解和习 题

运算规则:[x+y]补=[x]取补+[y]补
②定点补码减法运算
补 补 补 补 运算规则:[x-y] =[x+(-y)] =[x] +[-y]
补 补 [-y] 的求法是将[y] 的各位(包括符号位)全取反,最末位
反码:正数的反码同原码, 负数的反码为除符号位外,其它各位 按位取反。
正数的反码是其本身, 负数的反码是在其原码的基础上,符号 位不变,其余各个位取反
1的反码是00000001, —1的反码是11111110。
补码:正数的补码同原码,负数的补码为反码加1。 负数的补码是在其原码的基础上, 符号位不变, 其余各
加1。
补 补 即将[y] 连同符号位一起取反加1便可得到[-y] 。
[-x]补=模 - [x]补
[x]补=模 - [-x]补 比如8bit,模= 28
如:
补 补 补= [y] =10001010,则[-y] =01110110; [-1]
28 - [1]
补=1_0000_0000 - 0000_0001 = 1111_1111
若计算结果比能表示的最大数还大则称为上溢,上溢时一般作溢出 中断处理;
若计算结果比能表示的最小数还小则称为下溢,下溢时一般作机器 零处理。
下面介绍用双符号判断溢出方法:
引入两个符号位Cs+1、Cs Cs+1用来表示两个符号位向更高位进位时的状态,有进位时 Cs+1=1,无进位时Cs+1=0; Cs用来表示两数值的最高位向符号位进位时的状态,有进位时 Cs=1,无进位时Cs=0; 当Cs+1Cs=00或11时,无溢出;当Cs+1Cs=01或10时,有溢出,
计算机原理 计算机中数据的表示方法

第二章计算机中数据的表示方法第一节计算机中数据的分类和表示方法计算机内部传送的信息分为两大类:控制信息和数据信息。
数据信息又分为两种,数值型数据和非数值型数据。
注意:任何数据在计算机中都是用二进制表示的。
一、数据的单位1.位(bit):是计算机中最小的数据单位,常用小写字母b来表示。
2.字节(Byte):用大字母B来表示,1B=8b表示文件的长度,衡量存储器的容量,存储器编址用字节做单位。
磁盘的存储单位是:簇磁盘存放信息的最小编址单位是:扇区信息编码的的最小单位是:码元3.字(word):由若干字节组成,是字节的整数倍。
在计算机内部进行数据传送,或CPU进行数据处理时,用它作基本单位。
字的长度即字长,并不是所有的计算机字长都一样,常见的字长有16位,32位,64位。
字长是CPU一次能够处理二进制的位数。
字长越长,计算机速度越快,精度越高。
4.常用的存储单位之间的换算1TB=1024GB 1GB=1024MB 1MB=1024KB 1KB=1024B 210 1B=8b二、数据的分类1.按数据处理方式分类数值型和非数值型非数值型又分为:字符数据和逻辑数据2.按数据传输形式分类数字数据和模拟数据数字数据:离散型的;模拟数据:连续的值模拟数据被数字化后存入计算机,采用模数转化将模拟数据数字化后存入计算机。
三、数据的表示方法1.数值型数据的表示(1)按小数点的处理可分为定点数和浮点数。
(2)按符号位有原码、补码,反码三种形式的机器数2.非数值型数据的表示第二节各种数制及其转换方法一、数制的组成数制是指计数的方法,任何一种数制都有两个要素:基数和权。
例如二进制数1001.01,它的基数是2,最左边1的权是23,最右边的1的权是2-2。
234二、常用字的数制二进制(B),八进制(Q),十进制(D),十六进制(H)三、不同进制之间的转换1.十进制转换成非十进制分成整数部分和小数部分:整数部分:除基数倒取余小数部分:乘基数取整注意:十进制数转换在二进制数的方法是除2倒取余。
机器数的表示与运算

反码
对一个机器数X: 若X>0
[X]反=[X]原
若X<0
[X]反= 对应原码的符号位不变,数值部分按位求反
7
[例]
X= -52 = -0110100 [X]原=1 0110100 [X]反=1 10010 Nhomakorabea18
0的反码:
[+0]反 =00000000 [-0]反 =11111111 即:数0的反码也不是唯一的。
9
补码
定义: 若X>0
[X]补= [X]反= [X]原
若X<0
[X]补= [X]反+1
10
[例]
X=-52= -0110100
[X]原=10110100 [X]反=11001011 [X]补= [X]反+1=11001100
11
0的补码:
[+0]补= [+0]原=00000000 [-0]补= [-0]反+1=11111111+1
机器数的表示与运算
1. 机器数
计算机中的数称为机器数 构成:
符号位 + 真值
“0” “1”
表示正 表示负
2
[例]
+52 = +0110100 = 0 0110100
符号位 真值
-52 = -0110100 = 1 0110100
符号位 真值
3
2. 机器数的表示
机器数的表示方法:
原码 反码 补码
4
原码
最高位为符号位,其余为真值部分。
“0”表示正 “1”表示负
优点:
真值和其原码表示之间的对应关系简单,容易理解;
缺点:
计算机中用原码进行加减运算比较困难 0的表示不唯一。
原码,反码,补码及运算

原码,反码,补码及运算一、定义1.原码正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值。
用这样的表示方法得到的就是数的原码。
【基准2.13】当机器字长为8十一位二进制数时:x=+1011011[x]原码=01011011y=+1011011[y]原码=11011011[+1]原码=00000001[-1]原码=10000001[+127]原码=01111111[-127]原码=11111111原码则表示的整数范围就是:-(2n-1-1)~+(2n-1-1),其中n为机器字长。
则:8十一位二进制原码则表示的整数范围就是-127~+12716十一位二进制原码则表示的整数范围就是-32767~+327672.反码对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。
【基准2.14】当机器字长为8十一位二进制数时:x=+1011011[x]原码=01011011[x]反码=01011011y=-1011011[y]原码=11011011[y]反码=10100100[+1]反码=00000001[-1]反码=11111110[+127]反码=01111111[-127]反码=10000000负数的反码与负数的原码存有非常大的区别,反码通常用做谋补码过程中的中间形式。
反码则表示的整数范围与原码相同。
3.补码正数的补码与其原码相同,负数的补码为其反码在最低位加1。
导入补码以后,计算机中的以此类推运算都可以统一化成补码的乘法运算,其符号位也参予运算。
【例2.15】(1)x=+1011011(2)y=-1011011(1)根据定义存有:[x]原码=01011011[x]补码=01011011(2)根据定义存有:[y]原码=11011011[y]反码=10100100[y]补码=10100101补码表示的整数范围是-2n-1~+(2n-1-1),其中n为机器字长。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在计算机的存储器中统一采用二进制数的方式进行数据存储。
而编程中则综合使用二进制、八进制、十进制与十六进制的数据表示方法,程序编译后一般生成十六进制的可烧写文件,而烧写到存储器后最终在存储单元中存放的还是二进制形式。
而二进制又有真值,原码,反码,补码,机器数,有符号数,无符号数,等诸多概念之分。
故下面主要就二进制数(以整数为例,后面提到的数据皆指整数)的存储与运算过程中涉及到的一些概念与规则进行梳理。
讲的主要是在计算机中的,以8位单片机为例,后面以32位ARM单片机指令举例。
1有符号数和无符号数。
数据首先分为有符号数和无符号数。
对于无符号数来说,肯定指的0与正数,无负数之说,自然也无原码、反码、补码之说,一般也不针对于无符号数讨论机器数、真值等概念。
其存储方式与有符号数存储也无特别之处,具体的将在“存储单元中的数据”一节讲述。
有符号数,有正负与0三种,由于在计算机中无法表示负号,或者说用专门的符号表示负号很不方便,于是就采用对正负号进行数值编码的方式,用“0”代表非负数,“1”代表负数。
根据不同的编码方式,对有符号数一般可以有原码、反码、补码三种最常见的编码形式。
2 真值
真值就是所表示的数的大小,一般用10进制表征。
3 原码、反码、补码
具体概念我就不重复了,只重申下相关结论:
a.正数的原码、反码、补码都相同。
b.负数的反码为原码的按位取反(保持符号位不变),补码为反码加1.
4 机器数
原码、反码、补码都是机器数的一种表示形式,或说都属于机器数。
5 存储单元中的数据(存储单元包括存储器中的存储单元和寄存器)
在计算机的存储器的存储单元中的数据均以补码形式存放的,于是在计算机中的数据表示有下面结论:
a不使用原码与反码。
但原码与反码可以作为计算真值的中间媒介。
b存储单元中的数据以补码形式存在。
c 数据的存取与运算都以补码形式进行。
d补码就是机器数,机器数就是补码。
解释:
掌握一个基本原则——简单,
存储单元是个很有原则的家伙,他只管存01序列,才不管该序列是表示指令编码还是数据呢,更不会管是有符号数还是无符号数,也不管是数据的原码、反码还是补码。
只是人们考虑到0只有在补码中的表示才是唯一的,故规定数据以补码形式在计算机中存储。
这就是数据存在的简单原则。
要知道,数据在计算机内部的存在形式以及转移、运算过程中,都是一串高低电平组合,如果要在数据转移、运算过程中还要考虑补码、原码、反码的转换,
将大大增加硬件复杂度,而这种转换本身也是没有意义的。
所以如果你已知某存储单元中的内容是
1:
1000 0001 + 0000 0001 = 1000 0010
得到的结果是1000 0010,要对其进行存储的话,也是不需进行任何转化,直接对号入座:
这就是 数据的运算,按常规的二进制运算规则进行,只需保证结果只取后8位。
加满就进位,不够减就借位,根据最高位的状态是不是负数以及是否发生了进位与借位。
这就是数据运算的简单原则。
6 数据的运算以及对状态标志位NZCV(以ARM 为例)的影响。
就是普通的二进制运算规则。
结果为0时,Z = 1; 结果最高位为1时N = 1; 运算过程中最高位向前面的一位(可以认为该位就是C )进了1,则C = 1; 运算过程中最高位从前面的一位(可以认为该位就是C )借了1,则C = 0;运算中最高位只有进入(carryin )或进出(carryout ),或者只有借入(borrowin )或借出(borrowout ),则V = 1。
很容易得到Z = 0; N = 1; C = 1; V = 0;
7 从指令到存储单元
可能有些同学对从程序中的数据到存储单元(包括寄存器)中的数据怎样对应还有疑问。
以ARM 指令为例,如:
MOV R0, #0XFFFFFFFF;
简单,直接转化成二进制,即32个1,存到存储单元中。
MOV R0,
#0B1001 1100 0011 … 0001;
简单,不用做任何转化,直接存到存储单元中。
MOV R0,
#35;或MOV R0, # -35;
简单,直接转化为二进制补码,存到存储单元中。
其实,这些转化都是编译器在编译的过程中进行的,也就是“纯软件”操作。
一旦编译完成,把数据存到存储单元中,后面的就依据前面的提到的“三个简单原则”进行了。
8 从存储单元到指令
那么把存储单元中的数,或运算后的数取出来,其真值应该是多少呢?也简单,直接按补码的真值计算方法计算即可。
有没有可能是无符号数呢?即使你用unsigned in a;定义了一个无符号数,也可以认为是按补码形式存放的,因为如果你这样赋值:
a = -1;
如果你使用的编译器不报错的话,他也自动给你存的是-1的补码形式。
如果你这样赋值:
a = 65536*65536 - 1;
(即二进制的32个1)
在存储单元中存的是32个1;而给int b = 65536*65536 - 1;赋值,对应存储单元中依然存的是32个1.
内容都一样,又怎么区别那个是无符号数那个是有符号数呢。
其实在C语言中就看你把它给什么类型的变量,根据变量类型的不同,用不同翻译方法求取出的数据的真值即可。
而你怎么翻译,都跟计算机没关,他内部处理数据仍然只是按他自己的那几条规则。
9 ARM中的条件指令
如果运算时不进行有符号数、无符号数间的转化,怎么确定CC(无符号数小于),LT(带符号小于)等条件呢?其实二者并矛盾,因为CC的判断依据是标志位C = 0; 而LT的判断依据是标志位N≠V。
其他的也都是根据状态标志位来判断的。
而前面我们已经讨论了,确定条件标志位NZCV的状态时,只需按“数据运算的简单原则”进行,而不必管什么码啊,什么符号的。
当然也可以直接按字面意思来判断,即判断LT时,把后面的操作数都当做带符号数的补码,计算出对应的真值,就可进行判断是否“小于”;判断CC时,把后面的操作数都当做无符号数,即直接用二进制到十进制的转化规则(就是指数法嘛)来计算真值,然后就可以确定是否“小于”了。
通过对不同情况的考察会发现,两种方法是等效的。
10 ARM中字节到半字到字的扩展
在位数的扩展中,就要考虑有符号数和无符号数的区别了。
因为对于一个字节数1000 0001,扩展到一个字,即32位,扩展的原则是保证前后真值不变。
按有符号数扩展要在前面补24个1,按无符号扩展,则要补24个0.当然如果对于正数进行扩展,一律在前面补若干个0即可。
在这里对无符号数的特别关照,并不与前面的对无符号数的“忽略”相矛盾,因为把他当做有符号数还是无符号数,全凭用户(或程序员)决定,与计算机内部处理的“简单原则”无关。
如何决定?ARM提供了专门的指令,如LDRB,LDRSB,STRH,STRSH,等。
可见要想让计算机做额外的工作就必须付出额外的代价(指令的增多)。
而且可以说,只要没有标志性的无符号数处理指令,计算机的统一处理数据格式就是补码,或更根本的,就是高低电平序列。
11 总结
站在计算机的角度看待数据,以最简单的规则办事,就会看到有序的工作流
程了。
至于“直观”,就要用户付出一些精力来达到了。
作者:郭文龙
时间:2011/12/30。