二进制数的原码补码和反码课件
- 格式:ppt
- 大小:78.00 KB
- 文档页数:31
MOOC数字电子技术基础主讲人:侯建军教授北京交通大学电子信息工程学院第一节数制与编码三、二进制的原码、反码和补码各种数制都有原码和补码之分。
前面介绍的十进制和二进制数都属于原码。
补码分为两种:基数的补码和降基数的补码。
三、二进制的原码、反码和补码[]N N n-=2补(注:n是二进制数N整数部分的位数)二进制数N 的基数补码又称为2的补码,常简称为补码,其定义为:例:[1010]补=24-1010=10000-1010=0110[1010.101]补=24-1010.101=10000.000-1010.101=0101.011[1010.101]反=(24-2-3)-1010.101=1111.111-1010.101=0101.010(注:n 是二进制数N 整数部分的位数,m 是N 的小数部分的位数)例:[1010]反=(24-20)-1010=1111-1010=0101二进制数N 的降基数补码又称为1的补码,习惯上称为反码,其定义为:[]NN mn--=-)22(反三、二进制的原码、反码和补码[N ]反=01001001例:N =10110110根据定义,二进制数的补码可由反码在最低有效位加1得到。
即:[N ]补=无论是补码还是反码,按定义再求补或求反一次,将还原为原码。
即:01001001+ 00000001 0100101001001010[N ]补= [N ]反+1[[N ]补]补= [N ]原三、二进制的原码、反码和补码三、二进制的原码、反码和补码二进制正负数的表示法有原码、反码和补码三种表示方法。
对于正数而言,三种表示法都是一样的,即符号位为0,随后是二进制数的绝对值,也就是原码。
= 0 0101011例:(+43)D符号位绝对值二进制负数的原码、反码和补码:例:原码:符号位“1”+原码反码:符号位“1”+反码补码:符号位“1”+补码[-25]原= 1 0011001[-25]反= 1 1100110[-25]补= 1 1100111三、二进制的原码、反码和补码算术运算补码运算:[X 1]反+[X 2]反= [X 1+X 2]反符号位参加运算[X 1]补+[X 2]补= [X 1+X 2]补符号位参加运算在数字电路中,用原码求两个正数M 和N 的减法运算电路相当复杂。
3、带符号的⼆进制数(原码、反码、补码)1、数值的符号之前所提到的⼆进制数,没有考虑到符号问题,所指的都是⽆符号数。
但实际上数字是有正、负符号的。
以数字6为例,按照习惯的数学表⽰⽅法,正数6⽤+6表⽰,⼆进制为+110;负数6⽤-6表⽰,⼆进制数为-110.但在数字系统中,符号“+”、“-”也要数字化,⼀般将所对应的⼆进制数最⾼位增加多⼀位⽤来设为符号位,⽤“0”表⽰“+”、⽤“1”表⽰“-”。
为了区分⼀个符号数的“+”、“-”符号数字化前后的两种表⽰⽅法,引⼊真值和机器数两个术语。
真值:在⼀个⼆进制数前⾯⽤“+”、“-”表⽰正、负数的这种⼆进制数叫做真值。
机器数:将“+”、“-”符号⽤⼆进制码“0”、“1”表⽰的⼆进制数叫做机器数。
数据最后存到计算机中就是⽤机器数来表⽰的如下:+6 -> +110 -> 0110-6 -> -110 -> 1110(⼗进制数) (真值)(机器数)在计算机中最⼩基本的计算单位是字节,1字节=8位⼆进制数,由此可见最后存放到计算机中的机器数是8位⼆进制数,不够补0,符号位占据了1⼀个位置,所以到了最后只有7位数可以使⽤。
在c语⾔中使⽤ unsigned 关键字可以定义⼀个⽆符号的变量,可将变量的存储范围变⼤。
机器数是由符号位+⼆进制数组成的,机器数实际上是个⼤概念,意指这种类型的数据能存进去计算机,机器数在计算机中⼜有三种不同的表⽰⽅法,分别是:原码、补码、反码。
下⾯逐个列举2、原码将⼆进制数的真值中的正符号⽤0表⽰,负数符号⽤1表⽰,叫做数原码形式,简称原码。
例如:⼗进制为9的数,它的真值形式和原码形式如下所⽰:+9 -> +0001001 -> 0 0001001-9 -> - 0001001 -> 1 0001001(⼗进制数) (真值)(原码)原码⽤8位数码表⽰,最⾼位为符号位。
原码的优点是易于辨认,因为它的数值部分就是该数的绝对值,⽽且与真值和⼗进制数的转换⼗分⽅便。
反码在计算机内,定点数有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 1111000 B注意: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)。
因此,在模12的前提下,-10可映射为+2。
由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。
二进制原码, 反码, 补码的基础概念和计算方法一. 原码, 反码, 补码的基础概念和计算方法.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] = [00000001]原 = [00000001]反 = [00000001]补但是对于负数:[-1] = [10000001]原 = [11111110]反 = [11111111]补机器可以只有加法而没有减法计算十进制的表达式: 1-1=01.如果用原码表示1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.2.如果用反码表示1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反= [1111 1111]反= [1000 0000]原= -0用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的.而且会有[0000 0000]原和[1000 0000]原两个编码表示0.3.用补码表示1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]补 + [1111 1111]补= [0000 0000]补=[0000 0000]原=0这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:(-1) + (-127) = [1000 0001]原 + [1111 1111]原= [1111 1111]补 + [1000 0001]补= [1000 0000]补=-128注:-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].(-1) + (-1) = [1000 0001]原 + [1000 0001]原= [1111 1111]补 + [1111 1111]补= [1111 1110]补//负数原码=补码-1,再同位取反,符号位不变=[1000 0010]原=-2因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.三.总结综上所述,原码、反码和补码是计算机中用于表示有符号二进制数的三种重要方法。
二进制数的原码、补码和反码信息在计算机内的表示2.1 2.2 2.3 2.4 2.5 2.6 数据和信息二进制数值信息在计算机内的表示西文信息在计算机内的表示中文信息在计算机内的表示图形信息在计算机内的表示2.1.1数据P8ISO的定义:数据是对事实、概念或指令的一种特殊表达形式,这种特殊表达形式可以用人工的方式或者用自动化的装置进行通信、翻译转换或者进行加工处理。
一般的数字、文字、图画、声音、活动图像都是数据,计算机通过二进制编码形式对其进行处理。
计算机内部把数据区分为数值型和非数值Nanjing Normal Univ. Dept. of Computer Science 型。
2.1.2信息P8信息是有用的数据。
计算机信息处理的本质就是进行数据处理。
数据处理的目标是获得有用信息。
注意“信息系统”的用法。
常将信息系统称为:管理信息系统MIS(Man agement Information System) 或数据处理系统DPS(Data Processing System)Nanjing Normal Univ. Dept. of Computer Science2.2二进制P9什么是二进制何谓十进制?s=knkn-1。
.k0k-1k-2。
.k-m 特点:基数为十,逢十进一。
二进制特点:基数为二,逢二进一二进制优点:0,1两个状态易物理实现;运算规则简单。
Nanjing Normal Univ. Dept. of Computer Science二进制与十进制对照表(记忆)十进制0 1 2 3 4 5 二进制***** 0100 0101 十进制6 7 8 9 10 11 二进制***** 1010 1011 Nanjing Normal Univ. Dept. of Computer Science二进制数的运算P10算术运算:加法、减法。
0+0=0 0 -0=0 0+1=1 1+0=1 1+1=10 0- 1=1 1- 0=1 1- 1=0逻辑运算:或(∨) 、与(∧)、取反。
⼆进制的原码,反码,补码,移码
真值:
⽐如: 17,-17, 0, 0.625,-0.625
原码:
即真值的⼆进制表达⽅法,但是有符号位(最⾼位)和数值位的区分
⽐如:
- (17)原:(00010001)
- (-17)原:(10010001)
反码:
规定:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
⽐如:
- (17)反:(00010001)
- (-17)反:(11101110)
意义:反码没有任何意义,只是为了计算补码
注意规律:(17)反和(-17)反完全相反,包括符号位
补码:
规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后⼀位加1.
⽐如:
- (17)补:(00010001)
- (-17)补:(11101111)
意义:在计算机中,负数以其正值的补码形式表达。
注意规律:(17)补和(-17)补相加:⼆进制(1 0000 0000),超出8位表达,在硬件中就可以表⽰为(0000 0000)即为0⽬的:使⽤补码作为负数的表达形式,是为了两者相加即为;也是为了在做减法(-)操作时,可以转换为加法(+)
移码:
规定:把补码的符号位取,⽆论正数还是负数。
⽐如:
- (17)移:(10010001)
- (-17)移:(01101111)
意义:移码的意义是⽅便⽐较⼤⼩,正数的符号位是1,负数的符号位是0,这样就可以不区分符号位,直接⽐较⼤⼩
注意规律:数值位本就可以通过⼆进制⽐较⼤⼩,符号位修改后,也可⽤于⽐较。
计算机原理- 整数的补码,原码, 反码解释一:对于整数来讲其二进制表示没有符号位.一个字节的表示范围为00000000-11111111,由此可见一个字节的整数表示范围为[0,255=2^8 - 1]。
对于整数来讲,其二进制表示中存在一个符号位.先来看一下下面几个定义:1:在计算机中,负数以其正值的补码形式表达。
正数即在符号位补0.2:原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
3:反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
4:补码: 反码+1由以上可以得到.计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0;正数的原码、补码可以特殊理解为相同;负数的补码是它的反码加1。
范围: 正数 [00000000 - 01111111] 即[0, 2^7 - 1]。
负数 [10000000 - 11111111] 。
范围说明. 11111111 - 1 = 11111110,取反=00000001 即是-1. 10000000 -1 = 01111111,取反=10000000, 即是-128. 因此有一个有符号二进制表示范围是从[-128-127].解释二:大家都知道数据在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别0和1这两个数,所以根据排列,1个字节能代表256种不同的信息,即2^8(0和1两种可能,8位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是0~255(0~2^8 -1)这些数,一共是256个数,因为,前面说了,一个字节只能表示256种不同的信息。
别停下,还是一个字节的无符号整数,我们来进一步剖析它,0是这些数中最小的一个,我们先假设它在计算机内部就用8位二进制表示为00000000(从理论上来说也可以表示成其他不同的二进制码,只要这256个数每个数对应的二进制码都不相同就可以了),再假设1表示为00000001,2表示为00000010,3表示为00000011,依次类推,那么最大的那个数255在8位二进制中就表示为最大的数11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。
计算机二进制、八进制、十六进制及反码原码补码、逻辑运算二进制数据的表示法二进制数据也是采用位置计数法,其位权是以2为底的幂。
例如二进制数210-1-2据110.11,逢2进1,其权的大小顺序为2、2、2、2、2。
对于有n 位整数,m位小数的二进制数据用加权系数展开式表示,可写为:(aa...a...a)(n-1)(n-2)0(-m)2(n-1)(n-2)(0)(-m) aa...a ...a(n-1) * (n-2) ** (-m)* =2 + 2 + 2+2 二进制数据一般可写为:(a(n-1)a(n-2)…a(1)a(0).a(-1)a(-2)…a(-m))2。
注意:1.式中aj表示第j位的系数,它为0和1中的某一个数。
2.a(n-1)中的(n-1)为下标,输入法无法打出所以用括号括住,避免混淆。
3.2^2表示2的平方,以此类推。
【例1102】将二进制数据111.01写成加权系数的形式。
解:(111.01)2=(1×2^2)+(1×2^1)+(1×2^0)+(0×2^-1)+(1×2^-2)二进制和十六进制,八进制一样,都以二的幂来进位的。
二进制运算二进制数据的算术运算的基本规律和十进制数的运算十分相似。
最常用的是加法运算和乘法运算。
1.二进制加法运算有四种情况: 0+0=0 0+1=1 1+0=1 1+1=10 ps:0 进位为1【例1103】求 (1101)2+(1011)2 的和解: 1 1 0 1+1 0 1 1-------------------1 1 0 0 02.二进制乘法运算有四种情况: 0×0=0 1×0=0 0×1=0 1×1=1【例1104】求 (1110)2 乘(101)2 之积解: 1 1 1 0× 1 0 1-----------------------1 1 1 00 0 0 01 1 1 0-------------------------1 0 0 0 1 1 0(这些计算就跟十进制的加或者乘法相同,只是进位的数不一样而已,十进制的是到十才进位这里是到2就进了)3. 二进制减法 0,0=0,1,0=1,1,1=0,10,1=1。
原码,反码,补码及运算一、定义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为机器字长。
则:8位二进制补码表示的整数范围是-128~+127(-128 表示为10000000,无对应的原码和反码)16位二进制补码表示的整数范围是-32768~+32767当运算结果超出这个范围时,就不能正确表示数了,此时称为溢出。
计算机⼆进制中的原码,反码,补码计算机最基本的⼯作是处理数据,⽽数据的最底层表现形式是⼆进制,并⾮是我们⼈类熟悉的⼗进制。
可以这么认为,计算机其实是很“笨的”,它只理解⼆进制数据。
今天,主要介绍计算机是怎样做加减运算的。
你可能会想,加减运算?这么简单的事情,还⽤介绍?也许还真不是你想的那样。
计算机的运算是由CPU 完成的,⽽CPU 只会做加法运算,不会做减法运算,那计算机怎样完成减法⼯作呢?1,⼆进制数我们先来看看⼆进制数。
⼆进制数是由0,1 组成的,⽐如:⼗进制的5,⽤⼆进制表⽰是 101。
⼗进制的7,⽤⼆进制表⽰是 111。
数字由正数和负数组成。
为了表⽰正负数,计算机中就有了有符号数和⽆符号数之分:⽆符号数:英⽂为unsigned,只能表⽰正数。
有符号数:英⽂为signed,即能表⽰正数,⼜能表⽰负数。
C/C++ 语⾔中的数字有有符号数和⽆符号数之分。
Java 语⾔所有的数字都是有符号数。
假如,我们⽤ 4 位⼆进制,来表⽰⽆符号数,也就是只表⽰正数,能表⽰的范围是0 到 15,转换关系如下表:⼗进制数⼆进制数⼗进制数⼆进制数00000810001000191001200101010103001111101140100121100501011311016011014111070111151111有符号数,即要表⽰正数,也要表⽰负数。
要⽤⼆进制表⽰有符号数,需要⽤⼆进制的最⾼位来表⽰符号,0表⽰正,1表⽰负。
所谓的最⾼位,也就是最左边那⼀位。
⽤ 4 位⼆进制,来表⽰有符号数,能表⽰的范围是-8 到 7,转换关系如下表:⼗进制数⼆进制数⼗进制数⼆进制数00000-8100010001-1100120010-2101030011-3101140100-4110050101-5110160110-6111070111-71111上表中的最⾼位的符号位,已标红。
要注意,对于有符号的4 位⼆进制 ----1000不是-0,⽽是-8。