CSAPP问题浅谈

CSAPP:(计算机中数的表示与运算问题浅谈)

数在不同进制下的表示

在这里我们可以看到,我们日常生活中常使用的十进制数和计算机使用的二进制与十六进制之间的转化关系
虽然我们在生活中觉得十进制表示数字是无比的方便,但是,在计算机中,由于计算机本身不具备人类电脑的逻辑思维能力,本质上还是一种计算工具,因此,寻求一种简洁而又稳定的元素的表示方法,就显得很重要。经过人们的探索,只包含0和1两种状态的二进制表示法应运而生。

不同的感受

    

我们在生活中其实对于数的表示感受并不深刻,因为使用的都是十进制的表示。我们在做一些运算时,也从未去考虑这些运算会带来怎样的感受。因为在生活中,只要我们能够进行演算的,我们都不会认为它存在某些问题。然而,在计算机中,这就不一样了。
  为什么呢?我们之前已经学习过,计算机的数据都是存储在某种容器中的,那么,这个容器的量一定是有限的,首先我们要知道的是,在计算机中,数的存在,是不同于我们日常理解的。
  “数”在计算机中分为两种,即 有符号数:signed 和无符号数:unsigned;
  这两种数的存在是为了计算机能更方便更准确地处理各种数据,那么,这两种数的表示范围分别是多少呢?如下图所示:在这里插入图片描述
在这里我们可以看到两种不同类型的数据的表示范围,我们可以看到,无论是哪种数据类型,都存在上限与下限,并且,两种数据类型表示的数据范围也不尽相同,这不禁令我们产生疑问:该怎么进行数据运算呢?

计算中碰到的事儿

1.当一个纯粹的无符号数进行运算的时候,即我们不需要去考虑它的符号情况,那么,它与我们日常生活中的计算相仿,但仍有许多不同。以int型变量为例:
 简单的计算,诸如:1+1=2
          1000×2019=2019000
          1314520-520=1314000
          等等。
 这些计算都不会出现任何问题,故在此不做过多阐述。
 但是!!!如果是两个比较大的数之间的运算呢?
 比如,我们进行两个很大的数的运算,如:50000×50000=???
 如果是在实际生活中,我们会苦苦地进行计算。直至结果得出,结果为:2500000000,但在计算机中,这是不可能存在的,为啥呢???因为,计算机能表示的数是有范围的!!!!
 在32位/64位的电脑系统中,采用二进制存储方案,以int型变量为例,所有位数全为1,即1111111111111111,结果为:2^16-1。从这里我们可以看出,计算机表示的数并非是无穷大的。那么,如例题所示,两数之积明显超过了阈值,是不可能得到正确结果的。那最终运行的结果是什么呢?是:-1794927296
 为什么会发生这样“离奇”的事情呢?原因在于,一担数据进行运算的结果超过当前变量在计算机中所能表示的极限(最大值和最小值),就会发生溢出。我们来看看几个运算结果,代码如下:
 运行在基于ubantu上的Lunix系统这里插入图片描述
 运行结果如下:在这里插入图片描述
我们可以清楚的看到,不少运算结果都是负数。这样也证明了我们的结论,数的运算不可超过该类型数据在当前计算机系统中的极限值。所以,在构造表达式进行计算的时候,一定要注意范围!

2.单独的有符号数与无符号数的计算类似,不再赘言。

3.敲重点!!!
如果碰到头疼的有符号数与无符号数混在一起的比较该咋办呢???
不要头疼!!很简单,通通将该类型数据表示为对应的无符号整数值!!!也就是说,无符号数与有符号数混在一起时,无论数据多大,通通换成无符号数进行比较!!!
看看下面的比较结果,我们会更有感悟:在这里插入图片描述
从上图的运算结果中我们可以验证我们的结论,即有符号数与无符号数的比较规则,只要将规则牢记于心,这种运算并不是什么十分复杂的问题。

后记

我曾经十分想我碰到的七七八八的问题全部写出来,让以后学习的人不再感到困惑和迷茫,但是限于自身的水平,写的博客可能是七零八落的,并没有十分严格的逻辑和顺序,还请看博客的各位看官海涵。我将在今后对这些博客进行进一步的完善和修改,希望能够对学习计算机方面知识的人带来帮助。
版权所有,转载请注明出处。谢谢!
##参考教材在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值