トップC言語入門 > C言語における算術演算

C言語における算術演算

1.数値の基本データ型

数値の基本データ型として、整数を扱う int型、実数(浮動小数点)を扱う float型(単精度浮動小数点)とdouble型(倍精度浮動小数点) がある。

IEEE754形式では、float型は32ビット(4バイト)幅で、上位から順に符号部(1bit)、指数部(9ビット)、仮数部(23bit)で構成される。

double型は64ビット(8バイト)幅で、上位から順に符号部(1bit)、指数部(11ビット)、仮数部(52bit)で構成される。

次のプログラムの前半は数値 3 をint型,float型,double型の変数にセットした場合の様子を調べたものである。

後半は大きな数値での振る舞いを調べたものである。

[arith01.c]
#include <stdio.h>

int main() {
    int    i = 3;
    float  f = i;
    double d = i;
    int    j = f;

    int    i1 = 0x7ffff567;
    float  f2 = i1;
    int    i2 = f2;
    unsigned char *p;

    p = (unsigned char*)&i;
    printf("i=%02x %02x %02x %02x\n", p[3], p[2], p[1], p[0]);
    p = (unsigned char*)&f;
    printf("f=%02x %02x %02x %02x\n", p[3], p[2], p[1], p[0]);
    p = (unsigned char*)&d;
    printf("d=%02x %02x %02x %02x %02x %02x %02x %02x\n", p[7], p[6], p[5], p[4], p[3], p[2], p[1], p[0]);

    printf("j=%x\n", j);
    printf("i1=%08x, i2=%08x\n", i1, i2);
}

このプログラムの実行結果を下に示す。float型の仮数部は23ビットである。 従って、0x7ffff567のような大きな数値(符号部を除き31ビット)を 正確に float型に代入することはできない。 下位の8ビットが切り捨てか四捨五入されることになる。 このため、再び int 型に戻すと、0x7ffff567 が 0x7ffff580 に変わっている。 つまり、下位8ビットに当たるところで、四捨五入で大きくなったと推測される。

c:\sys>arith01
i=00 00 00 03
f=40 40 00 00
d=40 08 00 00 00 00 00 00
j=3
i1=7ffff567, i2=7ffff580

以上、浮動小数点は大きな数値が扱えるが、整数に限れば、有効桁数が小さくなることに注意を要する。

四則演算では、特に、除算に注意がいる。整数除算では、余りが無視される。 整数演算では余りを求める % 演算子があるが、浮動小数点演算では % 演算子は使えない。

2.数値の最大値・最小値

double型とfloat型の最大値・最小値は float.h で DBL_MAX, DBL_MIN および FLT_MAX, FLT_MIN という名前で定義されている。

整数型については limits.h で INT_MAX, INT_MIN, LONG_MAX, LONG_MIN などの名前で定義されている。


参考文献

[1] 浮動小数点数