计算机中的原码、反码和补码 看到这个标题,很多人有话要说了,切!这个东西每一本计算机基础知识的书中都有介绍的,你还拿出来Show什么嘛!我的原则是你需要就来看一看,懂就不要去理会,倒也不必讽刺两句,我相信总有需要它的人。当初我看书是没看明白的,在网上查了好多资料才有所悟。 前几天跟老婆讲原码、反码和补码的知识,老婆似懂非懂,在这里我发表一下我个人的意见,浅显的把我所理解的原码、反码和补码的知识总结一下,一来可以给不懂的人来点启示,二来也可以方便老婆以后记忆复习。理解有不对的地方希望大家予以指出,谢谢! 大家都知道数据在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别0和1这两个数,所以根据排列,1个字节能代表256种不同的信息,即28(0和1两种可能,8位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是0~255(0~28-1)这些数,一共是256个数,因为,前面说了,一个字节只能表示256种不同的信息。别停下,还是一个字节的无符号整数,我们来进一步剖析它,0是这些数中最小的一个,我们先假设它在计算机内部就用8位二进制表示为00000000(从理论上来说也可以表示成其他不同的二进制码,只要这256个数每个数对应的二进制码都不相同就可以了),再假设1表示为00000001,2表示为00000010,3表示为00000011,依次类推,那么最大的那个数255在8位二进制中就表示为最大的数11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。比如我给你一个2个字节大小的二进制码,首先声明它表示的是无符号的整数:0000000000000010,我们把前面的0省略,换算一下,它表示的也是数值2,和前面不同的是,它占了2个字节的内存。不同的类型占的内存空间不同,如在我的电脑中char是1个字节,int是4个字节,long是8个字节(你的可能不同,这取决于不同的计算机设置),它们的不同之处仅仅是内存大的能表示的不同的信息多些,也就是能表示的数范围更大些(unsigned int能表示的范围是0~28*4-1),至于怎么算,其实都是一样的,直接把二进制与十进制相互转换,二进制就是它在计算机中的样子,十进制就是我们所表示的数。啊哈,原来这些都是可以计算的呀,我曾经还以为不同的计算机储存的原理是不同的,取决于商家的喜好呢,呵呵。说了这么多怎么还没有提到原码、反码和补码呀,别急别急,心急吃不了热豆腐,呵呵,因为无符号的整数根本就没有原码、反码和补码。(啊,那不是被欺骗了,5555````我告诉妈妈去,哥哥欺负我)都说了别急嘛,你就不想想我说了这么半天的无符号整数,那么有符号的整数怎么办啊? 呵呵,对,只有有符号的整数才有原码、反码和补码的!其他的类型一概没有。虽然我们也可以用二进制中最小的数去对应最小的负数,最大的也相对应,但是那样不科学,下面来说说科学的方法。还是说一个字节的整数,不过这次是有符号的啦,1个字节它不管怎么样还是只能表示256个数,因为有符号所以我们就把它表示成范围:-128-127。它在计算机中是怎么储存的呢?可以这样理解,用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示27个数的绝对值,再考虑正负两种情况,27*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码。到这里很多人就会想,那负数是不是从10000001到11111111依次表示-1到-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为10000000的情况没有考虑在内。实际上,10000000在计算机中表示最小的负整数,就是这里的-128,而且实际上并不是从10000001到11111111依次表示-1到-127,而是刚好相反的,从10000001到11111111依次表示-127到-1。负整数在计算机中是以补码形式储存的,补码是怎么样表示的呢,这里还要引入另一个概念——反码,所谓反码就是把负数的原码(负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相同)各个位按位取反,是1就换成0,是0就换成1,如-1的原码是00000001,和1的原码相同,那么-1的反码就是11111110,而补码就是在反码的基础上加1,即-1的补码是11111110+1=11111111,因此我们可以算出-1在计算机中是按11111111储存的。总结一下,计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加1。下面再多举几个例子,来帮助大家理解!十进制 → 二进制 (怎么算?要是不知道看计算机基础的书去)47 → 101111有符号的整数 原码 反码 补码 47 00101111 00101111 00101111(正数补码和原码、反码相同,不能从字面理解) -47 10101111 11010000 11010001(负数补码是在反码上加1)再举个例子,学C语言的同学应该做过这道题:把-1以无符号的类型输出,得什么结果?(程序如下)#includevoid main(){ short int n=-1; cout<<(unsigned short int)n<} 首先在我的电脑中short int类型的储存空间是2个字节,你的可能不同,我说过,这取决于你的计算机配置。它能储存28*2=65536个不同的数据信息,如果是无符号那么它的范围是0~65535(0~216-1),如果是有符号,那么它的范围是-32768~32767(-215~215-1)。这道题目中,开始n是一个有符号的短整型变量,我们给它赋值为-1,根据我们前面所说的,它在计算机中是以补码1111111111111111储存的,注意前面说了是2个字节。如果把它强制为无符号的短整型输出的话,那么我们就把刚才的二进制把看成无符号的整型在计算机中储存的形式,对待无符号的整型就没有什么原码、反码和补码的概念了,直接把1111111111111111转化成十进制就是65535,其实我们一看都是一就知道它是范围中最大的一个数了。呵呵,就这么简单。你个把上面的源代码编译运行看看,如果你的电脑short int也是两个字节,那就会和我得一样的结果。你可以先用这个语句看看:cout<<<>看看你的电脑里的短整型占多少的储存空间,也可以用sizeof来看其它任何类型所分配的储存空间。 最后提醒一句,关于数据如何在计算机中储存的,这里只适用于整型的数据,对于浮点型的是另一种方式,这里我们暂时就不深究了。 欢迎大家给我指出我的不对之处,哪怕是小小的错别字,我也不胜感激!谢谢! posted on 2005-08-01 11:54 馒头 阅读(12331) 评论(87) 编辑 收藏 引用 所属分类: 3.『电脑技术』 -->// FeedBack: # re: 计算机中的原码、反码和补码 2005-10-06 11:21 | 馒头 其实计算机中的数值用补码来表示,一是为了防止0有2个编码,其次就是为了把减法运算用加法运算表示出来,以达到简化电路的作用。具体内容请参看一些专业书籍,比如华中科技大出版的《逻辑设计》(呵呵,我大二的课本)。 回复 更多评论 # re: 计算机中的原码、反码和补码 2005-10-21 12:12 | cch 各位,我想问个问题,在这里减法是用加法实现的,那么会不会出现益出现象呢?出现,会是怎样的呢?该怎么处理,望各位给个答复 回复 更多评论 # re: 计算机中的原码、反码和补码 2005-10-22 18:30 | 馒头 当然会出现溢出现象咯,溢出的结果就是两个机器数(二进制)相加所得的机器数所表示的真值呀。 回复 更多评论 # re: 计算机中的原码、反码和补码 2005-10-24 13:17 | xjwsrfxj 讲得清楚明了,我在学校没学明白的东西,让你一点就透了。谢谢! 回复 更多评论 # re: 计算机中的原码、反码和补码 2005-11-04 08:59 | alan 讲得很不错,应该收录到教材中。谢了。 回复 更多评论 # re: 计算机中的原码、反码和补码 2005-11-07 07:22 | dewyer 请问,为什么文中47的反码是:10101111而不是与其原码一样? 回复 更多评论 # re: 计算机中的原码、反码和补码 2005-11-07 20:58 | 馒头 不好意思,手误!已更正。顺便说一下:为什么用补码表示有符号整数。比如8位整数表示的范围是-128~127,而不是-127~128呢?想过没有,为什么二进制10000000在原码和反码中表示0,在补码中它不表示0,保证了0表示的唯一性,但是它为什么表示负数,而不是整数,你也许会说,因为它符号位是1呀,表示负数呀,对,继续,+128我们用补码怎么表示,包括符号位,表示为010000000,超过了2个字节,如果截取低8位,那么是10000000,最高位(符号位)是1,表示的是一个负数,我们再看看-128的机器码是多少,原码110000000,反码101111111,补码110000000,截取低8位即10000000,表示的是一个负数。其实呀,这些总结出来的东西都是玩巧,也并不是说非要这样实现,学了计算机逻辑原理,就知道,其实这样做是由于物理条件关系。因为运算器里这样做更容易实现计算。 回复 更多评论 # re: 计算机中的原码、反码和补码 2005-12-16 15:37 | 刀刀 3. 已知X1=1001 X2=-1011 求X1和X2的原码和反码4. 已知X=1010 Y=10011利用补码的计算分别求[X+Y]补和[X-Y]补的值5. 已知机器字长是8位求-46的补码的值用十六进制表示.这个怎么做 回复 更多评论 # re: 计算机中的原码、反码和补码 2005-12-16 17:36 | 馒头 3、X1 原码 01001 反码 01001 X2 原码 11001 反码 10110 (最高位符号位)4、X 原码 001010 X 补码 001010 Y 补码 010011 -Y 补码 101101 [X+Y]补=001010+010011=011101 [X-Y]补=001010+101101=110111 (位数要对齐,简单的说就是要事先规定好位数,如第5题 最高位添符号位,注意进位舍去)5、46原码 0010 1110(8位) -46补码 1101 0010 根据 (1101)2--(13)10--(D)16 (0010)2--(2)10--(2)16 即答案为 D2 回复 更多评论 # re: 计算机中的原码、反码和补码 2005-12-18 23:50 | peter int x=-70;int y=2;int z=x>>yz的值是多少? 主要是不明白 负数移位该怎么算? 回复 更多评论 # qingjiao 2005-12-19 14:21 | yiyuan 请问最小的一字节的无符号整数是多少 回复 更多评论 # re: 计算机中的原码、反码和补码 2005-12-20 13:21 | 馒头 To:楼上的楼上的peter-------------------在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位相当于除以2 取整我们验证一下 用-70除以2*2 结果取整 正好是我们推算的 -17在C++中 int 是四个字节 但是结果也是一样的 原因自己可以推算一下To:楼上的yiyuan---------------任何字节大小的无符号整数最小的一个都是0 机器码也全是0 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-01-18 14:03 | cai 小弟很菜,问个题目在8位运算中65-15具体怎么通过补码计算啊~~~ 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-01-22 14:31 | 馒头 8位 最高位符号位65 原码 00001001 补码 0111011115 原码 00001111 补码 01110001-15补码是将15的补码带符号位取反得 10001110把65和-65的补码二进制码包括符号位相加即可得多余8位舍去进位 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-01-22 16:59 | qiuyuebai mymail: qiuyuebai # gmail.com我糊涂了 15 的原码是0000 1111 补码也应该是 0000 1111 而不是0111 0001-15的原码是 0000 1111 反码是 1111 0000 那么补码应该是 1111 0001看了您的文章后,我的理解是这样的,不知道哪里错了?另,您提到的多余8位舍去进位是什么意思?请电邮回复,因为,blog的回复功能不能保证 我 随时跟随该post的回复评论...... 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-01-24 02:24 | 馒头 不好意思!我回复的时候搞错了~``紧张15的原码是0000 1111 补码也是0000 1111(←我错的地方)因为是正数 符号位(最高位)为0-15的原码是1000 1111(←注意这个地方你弄错了)符号为为1表示负反码就是 1111 0000(注意 原码 反码 补码之间转换的时候千万不要把符号位考虑进去) 补码就是 1111 0001如果你已经求出了15的补码 这里有个简便的方法求-15的补码:直接把15的补码包含符号位一起求反即可 即15补码 1111 0001 那么-15的补码 0000 1110补码计算了时候 符号位是要直接参与二进制运算了 而不是单独考虑所谓多余8位的进位舍去 其实就是比如 补码1111 1111再加任意非0数 原来这个补码表示的数就会发生溢出(比如加上 0000 0001原先符号位1表示负数 加后表示正数)这里也许你觉得没有必要 因为本身只能容纳8位 多余的当然要舍去可是你可能不知道 如果是反码进行运算的话 不是舍去多余进位 而是把多余的进位加到最低位 称为循环进位如果你要深入 建议你在网上搜索一些相关资料关键词: 数字电路 逻辑设计看幻灯片或文章都可以 也许还有课本 都是在第一章对这些知识都有介绍 回复 更多评论 # 请赐教 2006-01-27 07:13 | MR2 补码溢出如何处理 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-01-27 14:50 | 馒头 这就要看你处理数据的范围,比如我用8位二进制记录数据。只能储存-128~127之间的数据,如果超过127或小于-128就会溢出。比如127+1=-128 就是这个道理就好象最大值和最小值连成了一个环,超过了循环计算这样做才使得数据有规律性和周期性为了实现这个所以 补码是舍掉进位 而反码是循环进位 前面说过了解决的办法就是 如果8位的数据不过你就用16位的撒如果 整型不够就用长整型撒 实在不行就用浮点型的撒 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-02-27 03:19 | 杜宇 谢谢你,欣赏你务实的态度,这是真正做学问的态度 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-02-27 22:01 | 馒头 实在....实在是.....言重了~`` *^_^* 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-03 18:34 | 小日本专杀 还是不太明白8位二进制数如何表示-128,请赐教。多谢! 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-05 00:21 | Evil 小弟不才,刚学这个。想问一下怎样用C实现10进制和2进制的转换(就是输入一个10进制的数然后输出一个2进制的数或相反)。。。。。 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-06 12:18 | zjl 关于浮点数 能不能讲讲啊? 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-11 14:58 | 馒头 @小日本专杀8位二进制 最高位为符号位的话 剩下的7位表示绝对值如果用补码表示 -号符号位为1128表示的二进制位 1000 0000补码表示 取反末尾加一 0111 1111+1=1000 0000因为只能容纳7位数值 所以 应该是 000 0000加上符号位1 最后结果 1000 0000表示-128 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-11 15:01 | 馒头 @Evil在www.google.com中搜索 "C语言 进制转换" 就能查找到相关资料 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-11 15:05 | 馒头 @zjl很对不起 最近学习比较紧张 关于浮点数 请查阅相关书籍 比如 <<计算机组成原理>>或者在网站中搜索 "计算机组成原理 数的机器码表示" 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-12 01:35 | 路过 这学问做的。。。 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-12 01:43 | 路过 原文(负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相同),如-1的原码是00000001,和1的原码相同,...回复-15的原码是1000 1111(←注意这个地方你弄错了)符号为为1表示负 15补码 1111 0001 那么-15的补码 0000 1110 对二进制还没什么概念。正数的原反补码都是一样的,只有负数才有这些麻烦另外int,long的实际长度和c/c++什么的没什么关系。标准只规定了那些标准关键字一个大小关系,具体实现要根据机器和编译器你用的什么编译器?现在还有int是2个字节的么?long是8字节,你用的64位机吗 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-14 10:26 | 过路 原文中有符号的整数 原码 反码 补码 47 00101111 00101111 00101111(正数补码和原码、反码相同,不能从字面理解) -47 00101111 11010000 11010001(负数补码是在反码上加1)-47的原码是否应该为10101111? 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-14 22:02 | 馒头 TC2.0 上 int 是2个字节的long 在C++中是8个字节 32位机上也是8个字节你也许会说那不是8*8=64超过了 其实CPU它是分两步处理的具体内容看汇编语言 计算机组成原理 我正在学这些文章是我半年前写的 现在通过一段时间的学习成长了许多 回过头来看这些文章 有些太浅显了 而且片面很多都只是我当时的一种猜想罢了 本来想把这些文章删了以免……后来想其实学习也不过是一个不断探索的过程 而且这个过程很重要所以……可是学习太忙 初级程序员刚过 正在考中级程序员软件设计师还有吓死人的英语四级 实在没有时间更新我的博客了哎..... 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-14 22:04 | 馒头 -47的原码是 10101111我错了 已改正 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-17 07:31 | 路过 我举的例子是你在原文和回复中互相矛盾的地方 再说一遍,int,long等是c/c++规定的关键字,标准中只规定了他们的大小关系 sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) 并没有规定具体长度。我的问题就是针对你“long在c++中是8个字节”一类的说法的 int一般都等于机器字长。但就算是128,512也不奇怪,只要编译器愿意 你用VC++6, gcc等看一下(假设你在使用32位机) 另外还是对"TC2.0 上int是2字节"有些疑惑。。。你怎么判断的 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-22 13:23 | 馒头 我的是32位机vc++6.0 gcc CB6 上用 cout<<sizeof(int)<<endl;答案是4TC2.0 上用 printf("%d",sizeof(int));答案是2和编译器还是有关系的 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-25 10:51 | 璐璐 对不起,我是一个初学者,看了你的这篇文章,我知道了计算机中的原码、反码和补码的更多知识,但是我还有一个疑问,我还是不知道小数是否也有原码、反码和补码,查没有的话,为什么我们的教科书上有这样的题,要是有,那该怎么做呢?这位哥哥,我是还可以向你请教呢?你可以告诉我吗?我们书上没有讲到。 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-25 14:14 | Hukunamata 在这里疏通了以前的知识管道,谢谢楼主! 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-27 13:52 | goandmao int型是占用2个字节long(int)才占4个字节 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-28 19:51 | 小程 @过路 X ,当2n-1>X>=0请问整数原码的定义是否:[X]原={ 2n-1-X,当0>=X>-2n-1 X ,当2n>X>=0还是:[X]原={ 2n-X=2n+∣X∣,当0>=X>-2n 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-28 19:52 | 小程 X ,当2n-1>X>=0 请问整数原码的定义是否:[X]原={ 2n-1-X,当0>=X>-2n-1 X ,当2n>X>=0 还是:[X]原={ 2n-X=2n+∣X∣,当0>=X>-2n 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-03-31 11:29 | joeguan2 请教一下,对于字长为8位来说,-128D的补码具体怎么算,我说的是过程还有已知一个数的补码是78H,求这个数的真值和原码多谢了 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-04-17 16:49 | 没有把精髓讲出来 没有把精髓讲出来 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-04-19 06:47 | JIE 关于原码,反码,补码我还是不怎们懂啊~~46转为二进制不是0101110为什们你们的答案和我的不一样 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-04-19 16:51 | kitty 文章写得挺好,思路清晰下次可不可以再以这样方式,讲讲浮点数的范围是如何计算出来的呢?关注ING! 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-04-24 12:19 | 娌℃湁鎶婄簿楂撹鍑烘潵 其实搂主对补码是处于表象理解状态.还没有机掌握补码的真正原理.如果有一天你突然明白补码原来是靠溢出实现的时候,你才算真正明白.其实这个也很简单.求一个数的补码的最原始公式是2^n-|负数| (n是基于n位的补码)求反加1也是由这个公式推出的.国内的垃圾教材害了大家啊. 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-05-01 13:05 | 馒头 楼上的说得很对这些都只是表象 可以在刚接触的时候帮助你记忆但是如果你想弄清楚实质 推荐还是看看 数字逻辑电路之类的书籍这篇文章是大一写的 现在眼看大二也要结束了一年了成长太多 看看以前的东西 总觉太肤浅 但也是一份珍贵的回忆也许以后很长一段时间不能来这里了 谢谢大家关注了这么久 谢谢很快就要考软件设计师了 祝福我吧为中国的计算机事业而努力奋斗吧.. 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-05-01 14:01 | 濞屸剝婀侀幎濠勭翱妤傛捁顔夐崙鐑樻降 呵呵,祝福你啊 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-05-16 10:36 | 我就是补码 在补码算法中,负整数-x是用x的补码来计算的,例如+5二进制为0101,其反码应该为1010,所以-5才是1010,当考虑到进位的时候,才在尾数加1。例如:+3为0011,而-3则为1100,当-3+-5的时候,不考虑进位的情况下得到的是:0110。在补码算法中,由产生的进位应加到结果中,得:0111。由此才得+8的反码:0111。 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-05-24 11:23 | 绝处逢生 用双符号位表示,将最后的溢出位数直接扔掉。 回复 更多评论 # 始终有的疑结,请你帮我解答一下 2006-06-08 15:32 | the thirdway 8位的机器码,其原码的取值范围为什么是-((2^n-1)-1)<=x<=-((2^n-1)-1)-((2^8-1)-1)<=x<=-((2^8-1)-1)其实就是-127~127 怎么不是-128~128 呢? 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-09-17 21:11 | xieyf 总结一下:1。楼主的文章的错误: (负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相同) -1的原码是00000001,和1的原码相同,2。对不同的编译器,相同的数据类型的长度可能不同,因为在ISO/ANCI ++标准里并没有明确规定各种数据类型的长度,可用以下程序试试: //基本数据类型的长度#include <stdio.h>void main(){ printf(" (1) size of char is %d byte =%d bits. /n", sizeof(char),8*sizeof(char)); printf(" (2) size of short int is %d byte =%d bits. /n", sizeof(short),8*sizeof(short)); printf(" (3) size of int is %d byte =%d bits. /n", sizeof(int),8*sizeof(int)); printf(" (4) size of long int is %d byte =%d bits. /n", sizeof(long),8*sizeof(long)); printf(" (5) size of float is %d byte =%d bits. /n", sizeof(float),8*sizeof(float)); printf(" (6) size of double is %d byte =%d bits. /n", sizeof(double),8*sizeof(double)); printf(" (7) size of long double is %d byte =%d bits. /n", sizeof(long double),8*sizeof(long double));} 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-09-20 08:41 | coolooc 你好,有个问题不甚明白请教一下: 某计算机的IP地址为168.95.11.9,其子网掩码为255.255.255.0,求这台计算机的网络地址和主机地址各是什么?我按照书上说的——求网络地址就是将IP地址的二进制形式和子网掩码的二进制形式进行与运算得到的结果;求主机地址就是将IP地址的二进制形式和子网掩码的二进制形式的反码进行与运算得到的结果。 但是,我想知道的是:255.255.255.0的二进制为11111111.11111111.11111111.00000000其反码是100000000.10000000.10000000.00000000还是 00000000.00000000.00000000.11111111 因为书上讲最高位表示符号位,那11111111的最高位是1,表示负数,求其反码时除符号位以外0变1、1变0,那其反码就是10000000; 00000000最高位是0,表示正数,则正数的反码与原码相同,即还是00000000。这样做对么? 还有10000000对应的十进制为128,那他的反码是11111111还是01111111呢? 不理解! 请快点给我解答一下,不胜感激! 回复 更多评论 # 負數的位數轉換怎麼算啊 2006-09-21 14:32 | 深白 -(333.111)的 二進位轉換成四進位和八進位= =拜託各位高手了^^ 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-09-27 00:31 | oldzhang 用最高位定义为符号位是没有办法解释10000000表示-128的.实际上,错在了补码的定义:以8位二进制数为例,补码的定义为:一: 正数和0的补码就是该数自己;二: 负数的补码=模+该数,其中模等于255+1,就是8位最大的二进制数+1 或者说,负数的补码等于模-该负数的绝对值.例如-00000001的补码为(11111111+1)-00000001=11111111-128也就是-10000000的补码为(11111111+1)-10000000=10000000这样的定义,其结果是最高位等于1时,该数小于0 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-10-04 14:46 | 学计算机的老头 刚看了看你们的讨论,收获挺多,虽然老头了,但也插两句。:)要想理解这些,还是应该从公式下手。不要贪图省事,而记忆简单的东西。比如-1这个数,如果要以小数表示,那么是没有原码和反码的,但有补码,很多人可能不理解了,-1的原码就是10000001吗,可看了公式后,就知道了,这是整数表示形式,而非小数表示。 回复 更多评论 # 还是一知半懂 2006-11-09 16:24 | Saulzy 馒头大哥,看了你的文章明白了好多概念,但设计到具体的计算的时候我还是不是很清楚。你能否帮忙列个书目,我去找书看看。我是初学,想要个详细的数目。谢谢! 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-11-09 16:30 | Saulzy @娌℃湁鎶婄簿楂撹鍑烘潵这位大哥能否详细说下是怎么计算吖 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-11-17 09:53 | gzy524 这个问题我始终没想明白 我猜想估计要把物理里面设计的原因明了了才能真正明白补码的意思 哎 物理不懂啊 谁能把这些本质原因讲清楚啊我在网上搜索了一篇文章《对二进制补码数的进一步研究》文摘里讲这是一篇将有符号数与无符号数如何用二进制补码统一的研究我猜想补码是用了模这个概念设计的 而且方便计算同时也就是意味着物理实现 但是这篇文章要收费用 看不到啊 晕啊 有谁能真正指导再下一下感激不尽····:( 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-11-17 10:09 | gzy524 @xieyf第一点楼主是说错了 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-12-02 00:03 | cb 写得挺好 回复 更多评论 # re: 计算机中的原码、反码和补码 2006-12-25 16:49 | 刚哥 @coolooc关于计算机IP地址,用的无符号数。255取反就是全0。0取反就是255。-------------------------------关于原码反码补码,其实很简单:① 正整数是不存在反码补码的,如果非要说,也得说正整数的原码反码补码都相等且等于该正整数的二进制表示;② 负整数最高位为1(符号位),其补码是其反码加1,其反码是其原码除符号位外的位0→1,1→0;其原码则是该负整数绝对值对应的正整数的原码再在最高位上加个1(表示是负数)。------------------------------- 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-04-10 22:30 | 路过的啊 说实在的有错误,实在不如隐藏起来自己看或者删掉算了,容易误导初学者。其实每一本C语言的书里面说的都很清楚,要想更好的理解不如看看西安交通大学的《微型计算机原理》。 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-04-11 15:34 | yu 简单易懂 回复 更多评论 # re: 馒头 2007-05-04 18:36 | FZT 我想问一下:为什么正数补码和原码、反码相同 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-06-13 15:52 | 透透 看了您的网页真得很受感动阿,我把您的网址发给了我的男朋友和好友们,希望他们也能从中学到东西。 祝你们幸福啊~ 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-08-16 11:40 | 小楚 第四段第十二行: "-1的原码是00000001,和1的原码相同"后来举的例子 有符号的整数 原码 -47 10101111 楼主是否自相矛盾了? -1 的原码应是10000001,1的原码是00000001 ,以上所说不知是否正确,和楼主共同探讨. 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-09-10 17:55 | 十一 +121的原码 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-09-11 23:29 | nighteblis 还可以。就是罗嗦了点。。。当教材是肯定不行的。娃哈哈。 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-10-01 20:36 | Fresher 为什么计算原码.反码不行,要用补码 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-10-06 19:33 | yinne 我是大一的新生,今天自习时对这还是有点迷糊。看了你写的好多了。谢谢啊! 回复 更多评论 # re: 计算机中的原码、反码和补码[未登录] 2007-10-08 23:29 | David 求一个数的补码的最原始公式是2^n+X (n是基于n位的补码) 求反加1也是由这个公式推出的.国内的垃圾教材害了大家啊.其实计算机硬件补码的实现就是通过求反加1的(非门和加法器)物理电路实现要考虑的太多了 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-10-16 16:29 | aa 浮点型的数怎么存储?期待中。。。 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-10-28 22:41 | 敏 000 00 00 0 00 00 00 00 00 00 00 000 00 0 0 00 0;00 0 00 00 0 00 00 00000 000 00 0 00 0 00 00 0;00 0 00 00 0 00 00 000 00 00 00 0 00 000 00 000;00 0 00 00 0 00 00 00 00 00 0 00 0 0 00 000 00 0;00 0 00 00 0 00 000 0 00 0 0 00 0 00 0 00 00 000; 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-11-18 23:22 | Alligator 不错,最近我也在学习这方面的知识 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-11-28 14:21 | 林影斑驳 写的不错喔!!尽管学过,看起来都很有意思! 回复 更多评论 # re: 计算机中的原码、反码和补码[未登录] 2007-12-11 11:09 | c 如-1的原码是00000001 -47 的原码10101111 晕!! 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-12-21 14:06 | 反对是否是 误认子弟 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-12-22 16:18 | ER 内容挺好,思路也好.没错.即使很简单的东西.也总会有人需要他,我就是其中的一个.谢谢 回复 更多评论 # re: 计算机中的原码、反码和补码 2007-12-27 19:08 | 行云流水 建议:对过去讲过的内容,不断进行总结修正,也算是一种升华。楼主很实干,是做学问的人,我很敬佩。 回复 更多评论 # re: 计算机中的原码、反码和补码 2008-02-19 17:12 | 哈哈 有这样一道题:写出8位反码表示的最小整数?书上的答案是这样的:Min[X]反=[10000000]反=-1111111B=-127注:"反"在括号的右下角.我就不明白补码的最小值怎么会是[10000000]反呢?谁档以帮帮我.谢谢了! 回复 更多评论 # re: 计算机中的原码、反码和补码 2008-02-23 16:40 | Constantin 看了你的东西对我很有帮助 比上课效果还好 十分感谢 回复 更多评论 # re: 计算机中的原码、反码和补码 2008-03-19 22:07 | 111 懂就是懂,不懂再讲也不懂,我还不是不懂...我知道这个有什么好处啊,将来又不研究这个,为什么考试他非要考啊55555555555555 回复 更多评论 # re: 计算机中的原码、反码和补码 2008-03-31 10:10 | xiaolifeng 鸟人,误人子弟.如-1的原码是00000001,和1的原码相同,晕.blog.csdn.net/xiaoli_feng 回复 更多评论 # re: 计算机中的原码、反码和补码 2008-04-06 14:26 | 原码 我想问一下 -128 的原码 、反骂和补码是什么 ? -253的原码 、反骂和补码是什么 ? 回复 更多评论 # re: 计算机中的原码、反码和补码 2008-04-09 00:22 | one 谢谢楼主 回复 更多评论 # re: 计算机中的原码、反码和补码 2008-04-09 11:11 | 漫不经心 -1的原码你搞错了!应该是10000001 而不是你说的00000001 回复 更多评论 # re: 计算机中的原码、反码和补码 2008-04-15 15:25 | 越搞越复杂 哪有那么复杂,其实个人感觉不少书教的都是“复杂”,或者说表达的方式其实不能很好的让读者理解。负数的原码怎么可能与正数相同,最基本的最简单的都搞错了,只能说它们真值的绝对值相同。比如我们熟悉的十进制+5和-5,我们区别它们不就是看“5”前的符号“+、-”嘛,同理相对于二进制提及了“原码”一词,我们如何区别呢,即规定了在数的最高位置0或1来区分,也就是说把最高位当作符号看待,0正,1负。以8位二进制来示例,一看就简单明了:|5|=101=0000101 //为了区别先扩展表示为7位+5=0 0000101 //+5的原码-5=1 0000101 //-5的原码正数的原码、反码、补码都是一样的,所以我们理解的时候针对负数,负数的反码就是符号位不动,其余位取反就行了;负数的补码则是负数的反码+1就行了,一些书说的把负数对应的正数的补码取反再末位+1,其实都一样的,你认为怎么理解你受得了就怎么理解罢了。至于为什么用补码来加减运算就懒得打字了,网上一搜大把。很简单的问题没必要复杂化,大致理解一些原理情况下拿规则套上去就是了,毕竟绝对大多数人不是为了搞学问的而是为了搞应用的,就没必要过深的去论证什么,就像平常的1+1为什么等于2一样,我们没必要像一些数学家或学者一样去底层的论证及研究。 回复 更多评论 # re: 计算机中的原码、反码和补码 2008-05-20 07:50 | Ameise 楼主,提个不关痛痒的问题,你写的『如-1的原码是00000001,和1的原码相同,』我觉得有点问题,请修改 回复 更多评论 # re: 计算机中的原码、反码和补码 2008-05-23 14:26 | 小雨 十分赞赏你文章开头的那段话,是撒“总有人会需要它的”我就是正在备考《计算机组成原理》,又懒得买书,就一边看老师的课件一边在Google上搜,刚才搜“计算机 补码”就过来了。
计算机中的原码、反码和补码
最新推荐文章于 2020-11-30 23:00:00 发布