补码 反码,原码的问题

上传人:ji****72 文档编号:39546675 上传时间:2018-05-17 格式:DOCX 页数:8 大小:24.54KB
返回 下载 相关 举报
补码 反码,原码的问题_第1页
第1页 / 共8页
补码 反码,原码的问题_第2页
第2页 / 共8页
补码 反码,原码的问题_第3页
第3页 / 共8页
补码 反码,原码的问题_第4页
第4页 / 共8页
补码 反码,原码的问题_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《补码 反码,原码的问题》由会员分享,可在线阅读,更多相关《补码 反码,原码的问题(8页珍藏版)》请在金锄头文库上搜索。

1、1.1.如果你不知道二进制怎么编码,请继续,否则请跳到如果你不知道二进制怎么编码,请继续,否则请跳到 2 21 字节 = 8 位,所以它能表示的最大数当然是 8 位都是 1(既然 2 进制的数只 能是 0 或 1,如果是我们常见的 10 进制,那就 8 位都为 9,这样说,你该懂了? )1 字节的二进制数中,最大的数:11111111。这个数的大小是多少呢?让我们来把它转换为十进制数。无论是什么进制,都是左边是高位,右边是低位。10 进制是我们非常习惯的计 数方式,第一位代表有几个 1(即几个 100),第二位代表有几个 10(即几个 101),第三位代表有几个 100(即有几个 102),用

2、小学课本上的说法就是: 个位上的数表示几个 1,十位上的数表示向个 10,百位上的数表示几个 100同理可证,二进制数则是:第 1 位数表示几个 1 (20),第 2 位数表示几个 2(21),第 3 位数表示几个 4(22),第 4 位数表示向个 8(23)以前我们知道 1 个字节有 8 位,现在通过计算,我们又得知:1 个字节可以表达 的最大的数是 255,也就是说表示 0255 这 256 个数。那么两个字节(双字节数)呢?双字节共 16 位。 1111111111111111,这个数 并不大,但长得有点眼晕,从现在起,我们要学会这样来表达二制数:1111 1111 1111 1111,

3、即每 4 位隔一空格。双字节数最大值为:1 * 215 + 1 *214 + 1* 213 + 1 * 212 + 1 * 211 + 1 * 210 + + 1 * 22 + 1 * 21 + 1* 20 = 65535很自然,我们可以想到,一种数据类型允许的最大值,和它的位数有关。具 体的计算方法方法是,如果它有 n 位,那么最大值就是:n 位二进制数的最大值:1 * 2(n-1) + 1 * 2(n-2) + . + 1 * 202 2、理解有符号数和无符号数、理解有符号数和无符号数负数在计算机中如何表示呢?这一点,你可能听过两种不同的回答。一种是教科书,它会告诉你:计算机用“补码”表示

4、负数。可是有关“补码” 的概念一说就得一节课,这一些我们需要在第 6 章中用一章的篇幅讲 2 进制的 一切。再者,用“补码”表示负数,其实一种公式,公式的作用在于告诉你, 想得问题的答案,应该如何计算。却并没有告诉你为什么用这个公式就可以和 答案? -我就是被这个弄混淆的_另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是 0, 表示正数,最高位是 1,表示负数。这种说法本身没错,可是如果没有下文, 那么它就是错的。至少它不能解释,为什么字符类型的-1 用二进制表示是 “1111 1111”(16 进制为 FF);而不是我们更能理解的“1000 0001”。(为什 么说后者更好理

5、解呢?因为既然说最高位是 1 时表示负数,那 1000 0001 不是 正好是-1 吗?-re!当初偶就是这么想的,so 一直在脑中打架,越打越混 淆,)。让我们从头说起。2.12.1、你自已决定是否需要有正负。、你自已决定是否需要有正负。就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必 须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它 为带正负的类型。在计算机中,可以区分正负的类型,称为有符类型,无正负的类型(只有正值) ,称为无符类型。数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只 有符类型。字符类型也分为有符和无符类型。比如有

6、两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有 符的整数类型。2 2、使用二制数中的最高位表示正负。、使用二制数中的最高位表示正负。首先得知道最高位是哪一位?1 个字节的类型,如字符类型,最高位是第 7 位, 2 个字节的数,最高位是第 15 位,4 个字节的数,最高位是第 31 位。不同长度 的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类 型固定是 1 个字节,所以最高位总是第 7 位。(红色为最高位)单字节数: 1111 1111双字节数: 1111 1111 1111 1111四字节数: 1111 1111 1111 1111 1111 1111 1

7、111 1111当我们指定一个数量是无符号类型无符号类型时,那么其最高位的 1 或 0,和其它位一样, 用来表示该数的大小。当我们指定一个数量是有符号类型有符号类型时,此时,最高数称为“符号位”。为 1 时, 表示该数为负值,为 0 时表示为正值。3 3、无符号数和有符号数的范围区别。、无符号数和有符号数的范围区别。无符号数中,所有的位都用于直接表示该值的大小。有符号数中最高位用于表 示正负,所以,当为正值时,该数的最大值就会变小。我们举一个字节的数值 对比:无符号数: 1111 1111 值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22

8、+ 1* 21 + 1* 20有符号数: 0111 1111 值:127 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20同样是一个字节,无符号数的最大值是 255,而有符号数的最大值是 127。 原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权 值也是最高的(对于 1 字节数来说是 2 的 7 次方=128),所以仅仅少于一位, 最大值一下子减半。不过,有符号数的长处是它可以表示负数。因此,虽然它的在最大值缩水了, 却在负值的方向出现了伸展。我们仍一个字节的数值对比:无符号数: 0 - 255有符号数: -128

9、- 0 - 127同样是一个字节,无符号的最小值是 0 ,而有符号数的最小值是-128。所以二 者能表达的不同的数值的个数都一样是 256 个。只不过前者表达的是 0 到 255 这 256 个数,后者表达的是-128 到+127 这 256 个数。一个有符号的数据类型的最小值是如何计算出来的呢?有符号的数据类型的最大值的计算方法完全和无符号一样,只不过它少了一个 最高位(见第 3 点)。但在负值范围内,数值的计算方法不能直接使用 1* 26 + 1* 25 的公式进行转换。在计算机中,负数除为最高位为 1 以外,还采用补码 形式进行表达。所以在计算其值前,需要对补码进行还原。这里,先直观地看

10、 一眼补码的形式:以我们原有的数学经验,在 10 进制中:1 表示正 1,而加上负号:-1 表示和 1 相对的负值。那么,我们会很容易认为在 2 进制中(1 个字节): 0000 0001 表示正 1,则 高位为 1 后:1000 0001 应该表示-1。然而,事实上计算机中的规定有些相反,请看下表:二进制值(1 字节)十进制值 1 1000 0000 红色的 1 代表负数蓝色的是补码(补码=反 码+1)-1281 1000 0001 蓝色部分代表多大的值?:将补码还原为 原码-127 想化成负数?:先减去减去 1 1 再按位按位 取反取反 1 1000 0010 还原方法:补码-1 再取反-

11、126 1 1000 0011-125 . 1111 1110-2 1 1111 1111-1首先我们看到,从-1 到-128,其二进制的最高位都是 1(表中标为红色),正 如我们前面的学。然后我们有些奇怪地发现,1000 0000 并没有拿来表示 -0;而 1000 0001 也不 是拿来直观地表示-1。事实上,-1 用 1111 1111 来表示。怎么理解这个问题呢?先得问一句是先得问一句是-1-1 大还是大还是-128-128 大大?当然是 -1 大。-1 是最大的负整数。以此对应,计算机中无论是字符类型,或 者是整数类型,也无论这个整数是几个字节。它都用全 1 来表示 -1。比如一个

12、字节的数值中:1111 1111 表示-1,那么,1111 1111 - 1 是什么呢?和现实 中的计算结果完全一致。1111 1111 - 1 = 1111 1110,而 1111 1110 就是-2。 这样一直减下去,当减到只剩最高位用于表示符号的 1 以外,其它低位全为 0 时,就是最小的负值了,在一字节中,最小的负值是 1000 0000,也就是- 128。-小米批注:就是这部分蓝色的文字,让我终于能记清楚-1 的编码方式 了,汗。我们以-1 为例,来看看不同字节数的整数中,如何表达-1 这个数:字节数二进制值十进制值单字节数1111 1111 红色表示负数蓝色部分的补 码为值 1-1

13、负数:原码 就是原来的 表示方法、 反码是除符1111 1111 1111 1111-1号位(最高 位)外取反、 补码=反码+1 双字节数四字节数1111 1111 1111 1111 1111 1111 1111 1111-1可能有同学这时会混了:为什么 1111 1111 有时表示 255,有时又表示-1?所 以我再强调一下本节前面所说的第 2 点:你自已决定一个数是有符号还是无符 号的。写程序时,指定一个量是有符号的,那么当这个量的二进制各位上都是 1 时,它表示的数就是-1;相反,如果事选声明这个量是无符号的,此时它表 示的就是该量允许的最大值,对于一个字节的数来说,最大值就是 255

14、。ok 摘抄暂告段落,其实原文对于 c 的一些基础数据类型知识介绍的非常详细, 8 过太长了,摘到我需要的内容后就没全帖过来,如果有需要学习的同学,建 议参见原文:)转自 http:/ 二进制编码,负数二进制,二进制1-6 什么叫机器数?计算机为什么要采用补码? 2007-09-09 14:24:25 大 中 小 标签:教育杂谈 在计算机内部,所有信息都是用二进制数串的形式表示的。整数通常都有正负 之分,计算机中的整数分为无符号的和带符号的。无符号的整数用来表示 0 和 正整数,带符号的证书可以表示所有的整数。由于计算机中符号和数字一样, 都必须用二进制数串来表示,因此,正负号也必须用 0、1

15、 来表示。通常我们用 最高的有效位来表示数的符号(当用 8 位来表示一个整数时,第 8 位即为最高 有效位,当用 16 位来表示一个整数时,第 16 位即为最高有效位。)0 表示正 号、1 表示负号,这种正负号数字化的机内表示形式就称为“机器数”,而相 应的机器外部用正负号表示的数称为“真值”。将一个真值表示成二进制字串 的机器数的过程就称为编码。无符号数没有原码、反码和补码一说。只有带符号数才存在不同的编码方式。带符号整数有原码、反码、补码等几种编码方式。原码即直接将真值转换为其 相应的二进制形式,而反码和补码是对原码进行某种转换编码方式。正整数的 原码、反码和补码都一样,负数的反码是对原码

16、的除符号位外的其他位进行取 反后的结果(取反即如果该位为 0 则变为 1,而该位为 1 则变为 0 的操作)。而补码是先求原码的反码,然后在反码的末尾位加 1 后得到的结果,即补码是 反码+1。IBM-PC 中带符号整数都采用补码形式表示。(注意,只是带符号的整 数采用补码存储表示的,浮点数另有其存储方式。)采用补码的原因或好处如下。采用补码运算具有如下两个特征:1)因为使用补码可以将符号位和其他位统一处理,同时,减法也可以按加法来 处理,即如果是补码表示的数,不管是加减法都直接用加法运算即可实现。2)两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。这样的运算有两个好处:1)使符号位能与有效值部分一起参加运算,从而简化运算规则。从而可以简化 运算器的结构,提高运算速度;(减法运算可以用加法运算表示出来。)2)加法运算比减法运算更易于实现

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

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