码制和进制转换_第1页
码制和进制转换_第2页
码制和进制转换_第3页
码制和进制转换_第4页
码制和进制转换_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、原码 反码 补码的概念及运算(8位机为例)1、在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 2、补码与原码的转换过程几乎是相同的。数值的补码表示也分两种情况: (1)正数的补码:与原码相同。正数反码、补码是其本身。 (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。负数反码为:原码符号位不变,其他位全变。负数补码为:原码从右边数第一个1右边的不变(包括第一个1),第一个1左边的全变,符号位不变。十进制的-102

2、 二进制为:原码:11100110 反码:10011001补码:10011010 例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码0000111按位取反为1111000;再加1,所以-7的补码是11111001。 已知一个数的补码,求原码的操作分两种情况: 1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。 例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个

3、负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。 在“牵扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。我在这里稍微介绍一下“模”的概念: “模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。例如: 时钟的计量范围是011,模=12。 表示n位的计算机计量范围是02(n)-1,模=2(n)。“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。 例如: 假设当前时针指向10点,而准

4、确时间是6点,调整时间可有以下两种拨法: 一种是倒拨4小时,即:10-4=6 另一种是顺拨8小时:10+8=12+6=6 在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。 对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。 对于计算机,其概念和方法完全一样。n位计算机,设n=8, 所能表示的最大数是11111111若再加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为28。 在这样的系统中减法问题也可以化成加

5、法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。 另外两个概念一的补码(one's complement) 指的是正数=原码,负数=反码而二的补码(two's complement) 指的就是通常所指的补码。3.补码的绝对值(称为真值)【例7】-65的补码是10111111若直接将10111111转换成十进制,发现结果并不是-65,而是191。事实上,在计算机内,如果是一个二进制数,其最左边的位是1,则我们可以判定它为负数,并且是用补码表示。若要得到一个负二进制数的绝对值(称为真值),只要各位(包括符号位)取反,再加1,就得到真值。如:二进制

6、值:10111111(-65的补码)各位取反:01000000加1:01000001(+65的补码)补码的代数加减运算:1、补码加法 X+Y补 = X补 + Y补 【例8】X=+0110011,Y=-0101001,求X+Y补 X补=00110011 Y补=11010111 X+Y补 = X补 + Y补 = 00110011+11010111=00001010 注:因为计算机中运算器的位长是固定的,上述运算中产生的最高位进位将丢掉,所以结果不是 100001010,而是00001010。2、补码减法 X-Y补 = X补 - Y补 = X补 + -Y补 其中-Y补称为负补,求负补的方法是:符号位

7、为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 【例9】1+(-1) 十进制1的原码00000001 转换成补码:00000001,-1的原码10000001 转换成补码:11111111 ,1+(-1)=0,00000001+111111111=00000000,00000000转换成十进制为0,0=0所以运算正确。补码的代数解释:任何一个数都可以表示为-a=2(n-1)-2(n-1)-a;这个假设a为正数,那么-a就是负数。而根据二进制转十进制数的方法,我们可以把a表示为:a=k0*20+k1*21+k2*22+k(n-2)*2(n-2),这里k0,k1,k2,k(n-2)是1或

8、者0,而且这里设a的二进制位数为n位,即其模为2(n-1),而2(n-1)其二项展开是:1+20+21+22+2(n-2),而式子:-a=2(n-1)-2(n-1)-a中,2(n-1)-a代入a=k0*20+k1*21+k2*22+k(n-2)*2(n-2)和2(n-1)=1+20+21+22+2(n-2)两式,2(n-1)-a(1-k(n-2)*2(n-2)+(1-k(n-3)*2(n-3)+(1-k2)*22+(1-k1)*21+(1-k0)*20+1,而这步转化正是取反再加1的规则的代数原理所在。因为这里k0,k1,k2,k3不是0就是1,所以1k0,1-k1,1-k2的运算就是二进制下

9、的取反,而为什么要加1,追溯起来就是2(n-1)的二项展开式最后还有一项1的缘故。而-a=2(n-1)-2(n-1)-a中,还有-2(n-1)这项未解释,这项就是补码里首位的1,首位1在转化为十进制时要乘上2(n-1),这正是n位二进制的模。注:n位二进制,最高位为符号位,因此表示的数值范围-2(n-1) 2(n-1) -1,所以模为2(n-1)。上面提到的8位二进制模为28是因为最高位非符号位,表示的数值范围为028-1。进制转换不同进制之间的转换纯粹是数学上的计算。不过,你不必担心会有多么复杂,无非是乘或除的计算。生活中其实很多地方的计数方法都多少有点不同进制的影子。比如我们最常用的10进

10、制,其实起源于人有10个指头。如果我们的祖先始终没有摆脱手脚不分的境况,我想我们现在一定是在使用20进制。至于二进制没有袜子称为0只袜子,有一只袜子称为1只袜子,但若有两袜子,则我们常说的是:1双袜子。生活中还有:七进制,比如星期。十六进制,比如小时或“一打”,六十进制,比如分钟或角度为什么需要八进制和十六进制?编程中,我们常用的还是10进制必竟C/C+是高级语言比如:int a = 100,b = 99;不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。但,二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制

11、数表达将是:0000 0000 0000 0000 0110 0100面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C+ 没有提供在代码直接写二进制数的方法。用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。不过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢?2、8、16分别是2的1次方,3次方,4次方。这一点使得三种进制之间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。在下面的关于进制转换的课程中,你可以发现这一点。二、八、十六进制数转换到十进制数二进制数转换为十进制数二进制数第0位的权值是2的0次方,第1位的

12、权值是2的1次方所以,设有一个二进制数:0110 0100,转换为10进制为:0 * 2(0 )+ 0 * 2(1) + 1 * 2(2) + 1 * 2(3) + 0 * 2(4) + 1 * 2(5) + 1 * 2(6) + 0 * 2(7)= 100, 0乘以多少都是0,所以我们也可以直接跳过值为0的位:1 * 2(2) + 1 * 2(3 )+ 1 * 2(5) + 1 * 2(6) = 100八进制数转换为十进制数八进制就是逢8进1。八进制数采用 07这八数来表达一个数。八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方所以,设有一个八进制数:1507

13、,转换为十进制为:7 * 8(0) + 0 * 8(1) + 5 * 8(2 )+ 1 * 8(3) = 839结果是,八进制数 1507 转换成十进制数为 839八进制数的表达方法 C,C+语言中,如何表达一个八进制数呢?如果这个数是 876,我们可以断定它不是八进制数,因为八进制数中不可能出7以上的阿拉伯数字。但如果这个数是123、是567,或12345670,那么它是八进制数还是10进制数,都有可能。所以,C,C+规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C/C+中的表达方法。由于C和C+都没有提供二进制数

14、的表达方法,所以,这里所学的八进制是我们学习的,C/C+语言的数值表达的第二种进制法。现在,对于同样一个数,比如是100,我们在代码中可以用平常的10进制表达,例如在变量初始化时:int a = 100;我们也可以这样写:int a = 0144; /0144是八进制的100;一个10进制数如何转成8进制,我们后面会学到。千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是用于表达字符的“转义符”表达法。八进制数在转义符中的使用我们学过用一个转义符''加上一个特殊字母来表示某个字符的方法,如:&#

15、39;n'表示换行(line),而't'表示Tab字符,'''则表示单引号。今天我们又学习了一种使用转义符的方法:转义符''后面接一个八进制数,用于表示ASCII码等于该值的字符。比如,查一下ASCII码表,我们找到问号字符(?)的ASCII值是63,那么我们可以把它转换为八进值:77,然后用 '77'来表示'?'。由于是八进制,所以本应写成 '077',但因为C,C+规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以不写。事实上我们很少在实际编程中非要用转义符加八进制数来表

16、示一个字符,这些内容,大家仅仅了解就行。十六进制数转换成十进制数2进制,用两个阿拉伯数字:0、1;8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;10进制,用十个阿拉伯数字:0到9;16进制,用十六个阿拉伯数字等等,阿拉伯人或说是印度人,只发明了10个数字啊?16进制就是逢16进1,但我们只有09这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于

17、 15,即:F)表示的大小为 X * 16的N次方。假设有一个十六进数 2AF5, 那么如何换算成10进制呢?5 * 16(0) + F * 16(1) + A * 16(2) + 2 * 16(3) = 10997(别忘了,在上面的计算中,A表示10,而F表示15)现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。假设有人问你,十进数 1234 为什么是 一千二百三十四?你尽可以给他一个算式:1234 = 1 * 10(3) + 2 * 10(2) + 3 * 10(1) + 4 * 10(0)十六进制数的表达方法如果不使用特殊的书写形式,16进制数也会和10进制相混。随便一个数

18、:9876,就看不出它是16进制或10进制。C,C+规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也不区分大小写。(注意:0x中的0是数字0,而不是字母O)以下是一些用法示例:int a = 0x100F; int b = 0x70 + a;至此,我们学完了所有进制:10进制,8进制,16进制数的表达方式。最后一点很重要,C/C+中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能用达无符号的正整数,如果你在代码中里:-077,或者写:-0xF2,C,C+并不

19、把它当成一个负数。十六进制数在转义符中的使用,转义符也可以接一个16进制数来表示一个字符。如前面说的 '?' 字符,可以有以下表达方式:1)'?' /直接输入字符2)'77' /用八进制,此时可以省略开头的0 (3)'0x3F' /用十六进制。同样,这些只用于了解。除了空字符用八进制数 '0' 表示以外,我们很少用后两种方法表示一个字符。十进制数转换到二、八、十六进制数10进制数转换为2进制数,给你一个十进制,比如:6,如果将它转换成二进制数呢?10进制数转换成二进制数,这是一个连续除2的过程:把要转换的数,除以2

20、,得到商和余数,将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。听起来有些糊涂?我们结合例子来说明。比如要转换6为二进制数。“把要转换的数,除以2,得到商和余数”。 那么:要转换的数是6, 6 ÷ 2,得到商是3,余数是0。 “将商继续除以2,直到商为0”现在商是3,还不是0,所以继续除以2。那就: 3 ÷ 2, 得到商是1,余数是1。“将商继续除以2,直到商为0”现在商是1,还不是0,所以继续除以2。那就: 1 ÷ 2, 得到商是0,余数是1 (拿笔纸算一下,1÷2是不是商0余1!)“将商继续除以2,直到商为0最后将所有余数倒序

21、排列”好极!现在商已经是0。我们三次计算依次得到余数分别是:0、1、1,将所有余数倒序排列,那就是:110了!6转换成二进制,结果是110。把上面的一段改成用表格来表示,则为:被除数 计算过程 商 余数 6 6/2 3 0 3 3/2 1 1 1 1/2 0 1 (在计算机中,÷用 / 来表示) 如果是在考试时,我们要画这样表还是有点费时间,所更常见的换算过程是使用下图的连除:(略)说了半天,我们的转换结果对吗?二进制数110是6吗?你已经学会如何将二进制数转换成10进制数了,所以请现在就计算一下110换成10进制是否就是6。10进制数转换为8、16进制数 10进制数转换成8进制的方

22、法,和转换为2进制的方法类似,惟一变化:除数由2变成8。来看一个例子,如何将十进制数120转换成八进制数。用表格表示:被除数 计算过程 商 余数 120 120/8 15 0 15 15/8 1 7 1 1/8 0 1 ,120转换为8进制,结果为:170。10进制数转换成16进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成16。同样是120,转换成16进制则为:被除数 计算过程 商 余数 120 120/16 7 8 7 7/16 0 7 ,120转换为16进制,结果为:78。二、十六进制数互相转换二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C+程序员

23、都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。我们也一样,只要学完下面的内容,就能做到。首先我们来看一个二进制数:1111,它是多少呢?你可能还要这样计算:1 * 2(0) + 1 * 2(1) + 1 * 2(2) + 1 * 2(3) = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为2(3) 8,然后依次是 2(2) 4,2(1)2, 2(0) 1。记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。下面列

24、出四位二进制数 xxxx 所有可能的值(中间略过部分)仅4位的2进制数 快速计算方法 十进制值 十六进值1111= 8 + 4 + 2 + 1 = 15 F1110= 8 + 4 + 2 + 0 = 14 E1101 =8 + 4 + 0 + 1 = 13 D 1100= 8 + 4 + 0 + 0 = 12 C 1011= 8 + 4 + 0 + 1 = 11 B 1010= 8 + 0 + 2 + 0 = 10 A1001= 8 + 0 + 0 + 1 = 9 9.0001= 0 + 0 + 0 + 1 = 1 10000= 0 + 0 + 0 + 0 = 0 0二进制数要转换为十六进制,

25、就是以4位一段,分别转换为十六进制。如(上行为二制数,下面为对应的十六进制):1111 1101 , 1010 0101 , 1001 1011 F D , A 5 , 9 B 反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?先转换F:看到F,我们需知道它是15(可能你还不熟悉AF这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。接着转换 D:看到D,知道它是13,13如何用8421凑呢?应该是:8 + 2 + 1,即:1011。所以,FD转换为二进制数,为: 1111 1011由于十六进制转换成二进制相当直接,所以,我们需要将一个

26、十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:被除数 计算过程 商 余数 1234 1234/16 77 2 77 77/16 4 13(D) 4 4/16 0 4 ,结果16进制为: 0x4D2然后我们可直接写出0x4D2的二进制形式: 0100 1011 0010。其中对映关系为:0100 4 1011 D 0010 - 2同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成1

27、6进制,然后再转换为10进制。下面举例一个int类型的二进制数:01101101 11100101 10101111 00011011我们按四位一组转换为16进制: 6D E5 AF 1B 小数部分的进制转换 进制整数转换相信大家都会了,但进制的小数怎么转换,这个问题很好,因为很少会碰到小数的转换,所以一般老师都不会注重的讲,也就被忽略了。在这里我给大家一点提示:在进制的整数转换中,如(100110101)B1×2(8)+0×2(7)0×2(6)1×2(5)1×2(4)0×2(3)1×2(2)0×2(1)1×2(0)在整个转换过程中,2的幂从08;而如果是小

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论