瑞问:“在数学上,除法很特别,除不开的时候是显示小数还是分数?”
探索: 那我们就试试呗。
瑞问:“什么?显示3,既不是小数也不是分数,这怎么行?”
探索: 修改程序试一下23/8,看看结果是什么?
在C语言中,整数除以整数只能得到整数,小数部分会完全被舍弃。这个舍弃并不遵循四舍五入的规则。
在计算机中,存储器只能存储整数,没有存储小数点这个装置,所以小数运算需要特别复杂的设计。你可以思考一下,该如何解决这个问题?
比如,我们运算28+35会得出结果63,而2.8+3.5的结果是6.3。问题的关键是小数点,如果我们有能力表示小数点的位置,那么我们就能处理小数了。
瑞说:“存储数字的时候,只要在合适的位置点上小数点就好了。”
这不行。存储器不能存储小数点,只有数字,甚至连字母都没有。计算机里的一切信息都要转换成数字来存储。
瑞问:“难以想象,比如将字母a存到计算机里,该怎么存储呢?”
其实人们并不关心计算机怎么存储,只要存进去的是a,取出来还是a,就能接受了。比如,我们约定a在计算机里存储为100,从存储器里取出来时见到100,就显示a,中间有个转换过程,这样就能让只存储数字的计算机也能存储字母。
瑞说:“计算机怎么知道存的是数字100,还是字母a?”
这是个好问题,计算机不能区分,程序员可以区分。C语言要提供这样的区分手段,到目前为止,我们知道,字母会出现在""中,编译器见到""就会按照字母的规则存取。我这么说并不正确,因为""里面放的是一串字符(字符串),而字符用"来标识,比如,字符a就用'a'来标识。
瑞说:“所以,区分数字和字母也是设计C语言规则要考虑的问题,数字不用管,字符用''标识,字符串用""标识。”
差不多是这个意思,不过""是一堆字符在一起的简化表示,存取的规则和''相同。
瑞说:“我大体理解,小数也需要定义存和取的转换设计。”
是的,这个问题你先思考一下,后面我们详细讨论小数的处理方案。
瑞问:“好吧,关键是有没有什么办法能够除出来小数?”
可以,只要两个数有任意一个是小数就可以。
瑞说:“这样就可以得出小数了。”
因为小数需要特别的转换过程,所以在计算机中,整数运算的速度比小数运算快很多。如果两个数都是整数,计算机就会使用整数的运算规则,结果不会出现小数。一旦有一个数字是小数,计算机就会启动小数的运算规则。
瑞说:“所以10.0会逼迫计算机使用小数运算规则。”
如果两个整数相除,是不是就很像还没学到分数和小数的小学生?