(一)基本数据的表现形式(整数)

(一)基本数据的表现形式(整数)

1.整数的表现形式

  1.1 原码,反码及补码

  关于原码,反码,补码的概念,任何有计算机基础的人都不会陌生了,所以这里不提了。

  我们都知道数据在内存中都是01二进制的形式表示,整数分无符号整数,跟有符号整数,即正整数跟负整数。最高位代表符号位,当内存中的数据解释为无符号数时,最高位也参与计算。而当解释为有符号数时,最高位不参与计算,仅仅代表符号,0代表是正整数,1代表是负整数。整数都是以补码形式存在在内存中的,对于正整数的补码等于其原码,这个不过多解释了,下面着重说说负整数在内存中的表现形式。

  1.2 补码的概念

  至于为什么整数在内存中都要以补码形式表示,这个疑问曾今在我初学语言的时候困惑过我很久,希望下面的文字能让同样有此困惑的朋友有一种豁然开朗的感觉。

  首先得说说补码的概念。补码的概念还不简单么,大家都知道的: 补码 = 原码取反(反码) + 1,额,朋友没错,但这只是计算补码的公式,而不是其概念。

  补码的定义是什么,究竟什么是补码? ---- 补码就是用0减去这个数的绝对值。一定要牢记红色标记的这句话,这句话是让我们豁然开朗的关键。同时我们还要注意补码的概念是跟机器字长(CPU进行整数运算时,一次能最多处理的位数)紧密相关的,没有指定机器字长的补码没有任何意义。我们接下来用补码的概念推导出“补码 = 取反+1”这个公式出来。

  1.3 补码公式推导

  假设我们求-5的补码。根据概念我们有“-5(补) = 0 - |-5| = 0 - 5”,即“-5(补) + 5 = 0”。那么在32位机器字长中,有”0xFFFFFFFB + 5 = 0“(这里进位丢失了,所以说补码是跟特定的机器字长紧密相关的),所以0xFFFFFFFB就是-5的32位机器字长的补码。(后续的讨论都假设机器字长为32位)同样,反过来看的话,0xFFFFFFFB最高位是1,所以其代表一个负数,那么求其绝对值我们可以0-0xFFFFFFFB,等于"00000005"就是5了。其高位溢出了,我们可以用计算器演示一下,在windows自带的计算器中,我们选择四字长,也就是64位。计算”0-0xFFFFFFFB = FFFFFFFF00000005”,那么只取低32位就是"00000005"。

  接下来,我们知道任何一个负整数的绝对值加上它的反码等于0xFFFFFFFFF(注意这里只针对负整数,正整数的原反补三码相同),那么0xFFFFFFFF + 1的话由于进位丢失就等于0。于是我们有“| X | + X(反)+ 1 = 0”,进行一下简单的移项,我们又得出“X(反) + 1 = 0 - | X |”。怎么样,“0 - |X|”不正是我们补码的定义吗?所以我们为了求补码时的计算方便,我们可以套用公式:

“补码 = 取反+1”。

  1.4 补码的意义

  相信经过上面的公式推导,大家对补码一定有一个全新的认识。那么,我们再来看看补码的意义。我们知道计算机只会做加法,当我们需要做减法的时候怎么办呢?我们继续推导一下。

  假设我们要计算"X-Y",那么我们可以表示为“X + (0 - | Y |)”,而0 - |Y |,不正是补码的定义么,那么得出“X - Y = X + Y(补)”,所以补码的意义就是把减法转化成了加法!举个例子,比如我们计算“8-5”,首先转化为“8 + (0 - | -5|)” ,接着"0 - | -5| = -5(补) = 0xFFFFFFFB",最后“8+0xFFFFFFFB = 00000003”(进位丢失),所以8-5=3。呵呵,是不是觉得豁然开朗了?不得不佩服前辈们的智慧啊,简单的一个进位丢失就把减法搞定了。

  在这里,还要说一下比如0x8000000这个数,二进制是1000 0000 0000 0000 0000 0000 0000 0000,这个数最高位是1,我们解释为有符号数的时候,那么它代表负零。但是,零是没有正负之分的。怎么办呢?别急,0x80000000除了代表负零之外,还可以代表“0x80000001 - 1”,即-2147483648。这就解释了为什么一个有符号的数其负数区间的范围要比其正数区间的范围要多1个了。

  1.5 补码关键字

  在这里我总结了关于补码的几个关键字,方便大家理解记忆。负整数机器字长进位丢失

  负整数:正整数的原反补三码相同。

  机器字长:补码跟特定的机器字长紧密相关。

  进位丢失:最重要就是要理解这个进位丢失的精妙之处了。

  结束语:

  在本次学习中,学习了整数在内存中的表现形式,重点学习了负整数在内存中的表现形式,以及负数补码的相关概念。

  在下一次学习中,将会学习浮点数在内存中的表现形式。

  

转载于:https://www.cnblogs.com/lijianglidedaxia/archive/2013/01/22/2872014.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值