Linux 版 (精华区)

发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标  题: ◇ 星星流讲座 0006
发信站: 紫 丁 香 (Sun Nov  8 18:22:49 1998), 转信


寄信人: guest.bbs@hgluo.hust.edu.cn 
标  题: ◇ 星星流讲座 0006
发信站: 华南理工大学 BBS木棉站
日  期: Thu Feb 20 14:40:06 1997

发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test
标  题: 星星流讲座 0006
发信站: ☆清华电机☆ (Thu May  4 00:29:37 1995)


;35m第 2 讲 之 3            Arithmetic Operations
                        Topic: 进阶的运算子和数的值域m

算术运算中我们常常要做的就是指定 (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) 有什麽不同?
m++a 表示先把 a 加 1,再把 a 丢给取用它的式子; a++ 表示先把 a 丢给
取用它的式子,再把 a 加 10m。我们以後讲解阵列的时候,会以详细的例子
提醒各位这个陷阱。

到目前为止我们已经介绍了基本的数值型态,以及和数值运算相关的运算子,现
在我们来看看如何得知数值型态所能表示的□围:

/* 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 ..... 等等。值得注意的是,m每种基本的数值资料型态所占
的 byte 数取决於机器的设计,不同的机器、不同的编译器均可能导致不同的结果0m。

我们知道了每种数值资料型态的长度之後,便可以很轻易地求出它的值域了,例如:

          型态    长度 (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,谢谢。


--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--

                              Enjoy Linux!
                          -----It's FREE!-----

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.632毫秒