BBS水木清华站∶精华区

发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test 
标  题: 星星流讲座 0006 
发信站: ☆清华电机☆ (Thu May  4 00:29:37 1995) 
 
 
第 2 讲 之 3            Arithmetic Operations 
                        Topic: 进阶的运算子和数的值域 
 
算术运算中我们常常要做的就是指定 (assignment) 的动作,也就是把等 
号右边的数值指定给等号左边的数。指定运算子 (assignment operator) 
最常用的就是等号 = 。 
 
在 C 语言中,为了方便的因素,增加了许多指定运算子,它们的用法和功能 
请看下面的对照表你就很容易可以了解了: 
 
        原来的指定运算式        比较简单的指定运算式 
 
        a = a + b;              a += b; 
        a = a - b;              a -= b; 
        a = a * b;              a *= b; 
        a = a / b;              a /= b; 
        a = a % b;              a %= b; 
 
请注意的是 += 这类符号中 + 和 = 中间是没有空格的。 
 
由於我们在程式中常常会用到像 a = a + 1 或 a = a - 1 这种式子,所以 C 
特别提供了两个运算子:递增运算子 (increment operator) ++ 和递减运算子 
(decrement operator) --。它们的意义如下: 
 
        原来的指定运算式        比较简单的指定运算式 
 
        a = a + 1;              a++; 或 ++a; 
        a = a - 1;              a--; 或 --a; 
 
你心里也许有个疑问:++ 放前面 (prefix) 和放後面 (postfix) 有什麽不同? 
++a 表示先把 a 加 1,再把 a 丢给取用它的式子; a++ 表示先把 a 丢给 
取用它的式子,再把 a 加 1。我们以後讲解阵列的时候,会以详细的例子 
提醒各位这个陷阱。 
 
到目前为止我们已经介绍了基本的数值型态,以及和数值运算相关的运算子,现 
在我们来看看如何得知数值型态所能表示的□围: 
 
/* range.c */ 
 
#include <stdio.h> 
 
main () 

    printf ("%d %d %d\n", sizeof (short), sizeof (int), sizeof (long)); 
    printf ("%d %d %d\n", sizeof (float), sizeof (double),\ 
            sizeof (long double)); 

 
执行结果 (at Sun SPARC 10) 
 
2 4 4 
4 8 8 
 
首先说明 sizeof 的意思:sizeof 是一个特别的运算子,它用来传回某个型态一 
共占掉了记忆体空间多少 byte。像我们的例子中,short 型态占了 2 bytes,int 
型态则占了 4 bytes ..... 等等。值得注意的是,每种基本的数值资料型态所占 
的 byte 数取决於机器的设计,不同的机器、不同的编译器均可能导致不同的结果。 
 
我们知道了每种数值资料型态的长度之後,便可以很轻易地求出它的值域了,例如: 
 
          型态    长度 (bits)     值域 
 
                                    15     15 
signed    short   16              -2   ~ +2  - 1  => -32768 ~ +32767 
          int     32              -214783648 ~ 214783647 
unsigned  short   16              0 ~ 65535 
          int     32              0 ~ 4294967295 
 
                                           -38            +38 
          float   32              ±3.4×10    ~ ±3.4×10 
                                  (精确度小数点後 7 位) 
 
                                           -308            +308 
          double  64              ±1.7×10     ~ ±1.7×10 
                                  (精确度小数点後 15 位) 
 
目前几乎所有的编译器和电脑硬体都是支援 IEEE 的浮点数标准,所以浮点数都当 
成有号数来处理,无号浮点数是没有意义的。值域的详细求法请参考计算机结构方 
面的书籍,这不是我们研究 C 语言的重点所在 ^_^。 
 
在数值运算中,如果给定的数值超过了变数的数值型态所能表示的□围,就会产生 
溢位 (Overflow),例如: 
 
        short a; 
        a = 90000;      /* overflow */ 
 
浮点数运算中,求出来的值太小使得数值不能控制在精确度所能表示的□围,会产 
生缺位 (Underflow)。缺位的情形比较少见。 
 
数值运算除了溢位和缺位之外,还有一种常见的运算错误,那就是除以 0 (Divide 
by zero)。我们在写程式的时候要仔细考虑数值运算可不可能发生这三种错误,如 
果可能那麽必须想办法在程式中消除它,因为这些错误都会触发电脑的硬体产生错 
误讯号而直接停掉你的程式,严重的话可能导致当机。 
-- 
本文原作者为徐振家,原作刊载於星星神教总坛 ☆清华电机☆ test 板。 
你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。 
原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。 
未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。 
其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。 
对本文有任何疑问或意见请 mail 给 ax.bbs@bbs.ee.nthu.edu.tw,谢谢。 
 
 

BBS水木清华站∶精华区