浮動小数点データ・bit演算・#defineマクロ
演習も終わった所で、同じプログラムを効率良く記述できることを知ることを 目標に、bit演算や#defineマクロを説明する。
浮動小数点データ
浮動小数点形式のデータは、float,double の2通りがあるが、最近はほとんど double 型で 計算をすれば十分。単精度実数(float)と、その倍の倍精度実数(double)
((float)) S:符号(1bit) E:指数部(8bit) F:仮数部(23bit) SEEE,EEEE,EFFF,FFFF,FFFF,FFFF,FFFF,FFFF 指数部 - 127 float = 1.仮数部 * 2 ((double)) S:符号(1bit) E:指数部(11bit) F:仮数部(52bit) SEEE,EEEE...EEEE,FFFF,FFFF,.....,FFFF,FFFF 指数部 - 1023 double = 1.仮数部 * 2
bit演算子
2進数,8進数,16進数の変換プログラムでは、 2,8,16といった数値で割った余りや、商を求めることが多い。 コンピュータ内は2進数で扱っているため、16での余りを求める計算は、 下4bitを取り出したり、16で割るという計算は4ビットシフトに置き換えられる。 そこで、AND(&),OR(|),XOR(^),NOT(~)などのbit演算を説明。
printf( "%d" , 5 & 3 ) ; // 0101 & 0011 = 0001 = 1)10 printf( "%d" , 5 | 3 ) ; // 0101 | 0011 = 0111 = 7)10 printf( "%d" , 5 ^ 3 ) ; // 0101 ^ 0011 = 0110 = 6)10 printf( "%d" , 5 << 2 ) ; // 0101 左2bitシフト = 010100 = 20)10 printf( "%d" , ~10 + 1 ) ; // 反転+1は2の補数 = -10
#defineマクロ
N進数変換のプログラムの中には、下記のような部分があるけど、これを シンプルに書くためには、#defineマクロがよく利用される。
char s[...] ; if ( '0' <= s[i] && s[i] <= '9' ) .... #define isdigit(C) ('0' <= (C) && (C) <= '9') if ( isdigit( s[i] ) ) ...
C言語のプログラムは、最初にプリプロセッサと呼ばれる文字列置換プログラムによって、 #include や、#define の処理が行われる。 #define は、指定された文字を、指定された文字に置換する。 #define マクロは、それを関数的に記載できるようにしたもの。 閉じたサブルーチンと開いたサブルーチンの説明は次回に行う予定。