计算机中的原码、反码和补码

上传人:mg****85 文档编号:35295839 上传时间:2018-03-13 格式:DOC 页数:5 大小:33KB
返回 下载 相关 举报
计算机中的原码、反码和补码_第1页
第1页 / 共5页
计算机中的原码、反码和补码_第2页
第2页 / 共5页
计算机中的原码、反码和补码_第3页
第3页 / 共5页
计算机中的原码、反码和补码_第4页
第4页 / 共5页
计算机中的原码、反码和补码_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《计算机中的原码、反码和补码》由会员分享,可在线阅读,更多相关《计算机中的原码、反码和补码(5页珍藏版)》请在金锄头文库上搜索。

1、 大家都知道数据在计算机中都是按字节来储存了,1 个字节等于 8 位(1Byte=8bit),而计算机只能识别 0 和 1 这两个数,所以根据排列,1 个字节能代表 256 种不同的信息,即 28(0 和 1 两种可能,8 位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是 0255(028-1)这些数,一共是 256 个数,因为,前面说了,一个字节只能表示 256 种不同的信息。别停下,还是一个字节的无符号整数,我们来进一步剖析它,0 是这些数中最小的一个,我们先假设它在计算机内部就用 8 位二进制表示为 00000000(从理论上来说也可以表示成其他

2、不同的二进制码,只要这 256个数每个数对应的二进制码都不相同就可以了),再假设 1 表示为 00000001,2 表示为 00000010,3 表示为 00000011,依次类推,那么最大的那个数 255 在 8 位二进制中就表示为最大的数 11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。比如我给你一个 2 个字节大小的二进制码,首先声明它表示的是无符号的整数:0000

3、0000 00000010,我们把前面的 0 省略,换算一下,它表示的也是数值 2,和前面不同的是,它占了 2 个字节的内存。不同的类型占的内存空间不同,如在我的电脑中 char 是 1 个字节,int 是 4 个字节,long 是 8 个字节(你的可能不同,这取决于不同的计算机设置),它们的不同之处仅仅是内存大的能表示的不同的信息多些,也就是能表示的数范围更大些(unsigned int 能表示的范围是 028*4-1),至于怎么算,其实都是一样的,直接把二进制与十进制相互转换,二进制就是它在计算机中的样子,十进制就是我们所表示的数(误解:不同的计算机储存的原理是不同的,取决于商家的喜好呢)

4、。无符号的整数根本就没有原码、反码和补码。只有有符号的整数才有原码、反码和补码的!其他的类型一概没有。虽然我们也可以用二进制中最小的数去对应最小的负数,最大的也相对应,但是那样不科学,下面来说说科学的方法。还是说一个字节的整数,不过这次是有符号的啦,1 个字节它不管怎么样还是只能表示 256 个数,因为有符号所以我们就把它表示成范围:-128-127。它在计算机中是怎么储存的呢?可以这样理解,用最高位表示符号位,如果是 0 表示正数,如果是 1 表示负数,剩下的 7 位用来储存数的绝对值的话,能表示 27个数的绝对值,再考虑正负两种情况,27*2 还是 256 个数。首先定义 0 在计算机中储

5、存为 00000000,对于正数我们依然可以像无符号数那样换算,从 00000001 到 01111111 依次表示 1 到 127。那么这些数对应的二进制码就是这些数的原码。到这里很多人就会想,那负数是不是从 10000001 到 11111111 依次表示-1 到-127,那你发现没有,如果这样的话那么一共就只有 255 个数了,因为 10000000 的情况没有考虑在内。实际上,10000000 在计算机中表示最小的负整数,就是这里的-128,而且实际上并不是从 10000001 到 11111111 依次表示-1 到-127,而是刚好相反的,从 10000001 到 11111111

6、依次表示-127 到-1。负整数在计算机中是以补码形式储存的,补码是怎么样表示的呢,这里还要引入另一个概念反码,所谓反码就是把负数的原码(负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相同)各个位按位取反,是 1 就换成 0,是 0 就换成 1,如-1 的原码是 00000001,和 1 的原码相同,那么-1 的反码就是 11111110,而补码就是在反码的基础上加 1,即-1 的补码是 11111110+1=11111111,因此我们可以算出-1 在计算机中是按 11111111 储存的。总结一下,计算机储存有符号的整数时,是用该整数的补码进行储存的,0 的原码、补

7、码都是 0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加 1。下面再多举几个例子,来帮助大家理解!十进制 二进制 (怎么算?要是不知道看计算机基础的书去)47 101111有符号的整数 原码 反码 补码47 00101111 00101111 00101111(正数补码和原码、反码相同,不能从字面理解)47 10101111 11010000 11010001(负数补码是在反码上加 1,符号位不参与运算)再举个例子,学 C 语言的同学应该做过这道题:把1 以无符号的类型输出,得什么结果?(程序如下)#includevoid main()short int n=-1;cout看看你

8、的电脑里的短整型占多少的储存空间,也可以用 sizeof 来看其它任何类型所分配的储存空间。最后提醒一句,关于数据如何在计算机中储存的,这里只适用于整型的数据,对于浮点型的是另一种方式,这里我们暂时就不深究了。FeedBack:1为什么使用补码形式:其实计算机中的数值用补码来表示,一是为了防止 0 有 2 个编码,其次就是为了把减法运算用加法运算表示出来,以达到简化电路的作用。具体内容请参看一些专业书籍,比如华中科技大出版的逻辑设计(呵呵,我大二的课本)。为什么用补码表示有符号整数。比如 8 位整数表示的范围是-128127,而不是-127128 呢?想过没有,为什么二进制 10000000

9、在原码和反码中表示 0,在补码中它不表示 0,保证了 0 表示的唯一性,但是它为什么表示负数,而不是整数,你也许会说,因为它符号位是 1 呀,表示负数呀,对,继续,+128 我们用补码怎么表示,包括符号位,表示为 010000000,超过了 2 个字节,如果截取低 8 位,那么是 10000000,最高位(符号位)是 1,表示的是一个负数,我们再看看-128 的机器码是多少,原码110000000,反码 101111111,补码 110000000,截取低 8 位即 10000000,表示的是一个负数。 其实呀,这些总结出来的东西都是玩巧,也并不是说非要这样实现,学了计算机逻辑原理,就知道,其

10、实这样做是由于物理条件关系。因为运算器里这样做更容易实现计算。 2int x=-70; int y=2; int z=xy z 的值是多少?主要是不明白负数移位该怎么算? 在 C 语言中 int 是两个字节所以 70 在计算机中表示为 0000 0000 0100 0110 -70 用补码表示即 1111 1111 1011 1010 右移 2 位 C 语言中采用的是算术右移 所以补进位和原符号位相同即 1111 1111 1110 1110 取反加一求它的相反数 0000 0000 0001 0010 等于 17 所以右移后的结果是 -17 有个规则如果左移 1 位相当于乘以 2 右移 1

11、位相当于除以 2 取整 我们验证一下用-70 除以 2*2 结果取整正好是我们推算的 -17 在 C+中 int 是四个字节但是结果也是一样的原因自己可以推算一下 3. 在 8 位运算中 65-15 具体怎么通过补码计算啊15 的原码是 0000 1111 补码也是 0000 1111因为是正数符号位(最高位)为 0 -15 的原码是 1000 1111(注意这个地方你弄错了)符号为为 1 表示负 反码就是 1111 0000(注意原码反码补码之间转换的时候千万不要把符号位考虑进去) 补码就是 1111 0001 如果你已经求出了 15 的补码这里有个简便的方法求-15 的补码: 直接把 15

12、 的补码包含符号位一起求反即可即 15 补码 1111 0001 那么-15 的补码 0000 1110 补码计算的时候符号位是要直接参与二进制运算了而不是单独考虑 所谓多余 8 位的进位舍去其实就是比如补码 1111 1111 再加任意非 0 数原来这个补码表示的数就会发生溢出(比如加上 0000 0001 原先符号位 1 表示负数加后表示正数) 这里也许你觉得没有必要因为本身只能容纳 8 位多余的当然要舍去 可是你可能不知道如果是反码进行运算的话不是舍去多余进位而是把多余的进位加到最低位称为循环进位 4。补码溢出如何处理这就要看你处理数据的范围,比如我用 8 位二进制记录数据。 只能储存-128127 之间的数据,如果超过 127 或小于-128 就会溢出。 比如 127+1=-128 就是这个道理 就好象最大值和最小值连成了一个环,超过了循环计算 这样做才使得数据有规律性和周期性 为了实现这个所以 补码是舍掉进位 而反码是循环进位 前面说过了 解决的办法就是 如果 8 位的数据不过你就用 16 位的如果 整型不够就用长整型撒 实在不行就用浮点型的

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号