我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:热购彩票 > 反码 >

二进制负数的原码转换为补码的运算规则中的反码加一符号位参与运

归档日期:07-22       文本归类:反码      文章编辑:爱尚语录

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  知道合伙人互联网行家采纳数:24764获赞数:310572011年中山职业技术学院毕业,现担任毅衣公司京东小二向TA提问展开全部数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚.(摘自数学发展史有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制(23).下面进入正题.

  数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1Byte,原码能表示数值的范围为

  有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题:

  因为在两个正整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负整数身上,于是引出了反码(对于正整数原码、反码是一样的,而负整数的反码是原码除最高位(符号位)外其余所有位的逐位求反。).反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:

  问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).

  于是又引入了补码(用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的线个数的绝对值,再考虑正负两种情况,128*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码(和原码一样)。到这里很多人就会想,那负数是不是从10000001到11111111依次表示-1到-127,那你发现没有,如果这样的线的情况没有考虑在内。所以-1到-127不能那样表示(和原码的表示方法相同了,当然错了)。实际上,10000000在计算机中表示最小的负整数,即-128(原指-0的)。因为 -128+1=-127,那么把10000000加上1即10000001表示-127就容易计算很多了。这样,从10000001到11111111就刚好依次表示-127到-1。这就是所谓的补码。). 那么补码是怎样直接地转换得来呢?负数的补码就是对反码加一;而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:

  注意:当字长为8位时,(-128)没有相对应的原码和反码, (-128) = (10000000) (为什么?还有为什么8位整数表示的范围是-128~127,而不是-127~128呢?想过没有,为什么二进制10000000在原码和反码中表示0,在补码中它不表示0,保证了0表示的唯一性,但是它为什么表示负数,而不是正数,你也许会说,因为它符号位是1呀,表示负数呀,对,继续,+128我们用补码怎么表示,包括符号位,表示为010000000,超过了2个字节,如果截取低8位,那么是10000000,最高位(符号位)是1,表示的是一个负数了!我们再看看-128的机器码是多少,原码110000000,反码101111111,补码110000000,截取低8位即10000000,表示的是一个负数。)

  所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧!

  分析如下:以字长8位的机器码为例,如果最后加一,导致符号位后一位向符号位进1,既第七是 1,同理第六位也是 1,...由此得 对应的反码为:

  而补码的 1000 0000 是-128 与规定矛盾,难道要参与运算了吗?

  实际上在实际中的运算中,如果数据范围没有发生溢出,是不会出现 对反码的加一操作加到符号位的。因为 –128 的原码为

本文链接:http://withewind.com/fanma/266.html