数値の範囲と型
構文,変数の話をしたので、続いては数値範囲について解説。
変な動きのプログラム例
(( 平均を求める処理 )) int a[ 3 ] = { 10 , 10 , 20 } ; int s = 0 , i ; for( i = 0 ; i < 3 ; i++ ) { s += a[ i ] ; } printf( "%f" , s / 3 ) ; // 13.3333 ? (( 簡単な三角関数の計算 )) printf( "%f" , tan( 1/4 * 3.141592 ) ) ; // 1.0 ? (( 2点間の距離を計算 )) // 以下の計算を16bitコンピュータで実行したら... int x0 = 100 , y0 = 100 ; int x1 = 300 , y1 = 300 ; int r = sqrt( (x1-x0)*(x1-x0) + (y1-y0)*(y1-y0) ) ; printf( "%d" , r ) ; // 200*1.4142 = 282.84 ?
上記のプログラムは、どれも期待した答えが求まらない。 その理由を考える。
2進数でN[bit]の桁数があったら、1bitで2とおり,2bitで4とおり,Nbitで、 通りの状態を表せる。 これを数値として考えれば、2bitであれば00=0,01=1,10=2,11=3 として扱えばいい。 よってN[bit]の符号なし整数であれば、 0〜
の数値を扱える。
負の数を扱いたい場合には、最上位bitを符号を表すbitとして考え、 2の補数表現を用いる。2の補数表現は、引き算を足し算だけで扱える。
x = 10 で 8[bit]の場合 0000,1010 = 10 = x + 1111,0101 = (1の補数) ~x で表現 ------------ 1111,1111 = x + (~x) = 全bit1 + 0000,0001 ← 1を加えたら ------------ 1,0000,0000 = x + (~x) + 1 = 0 ただしN[bit]まで よって、(~x) + 1 = -x 負の数の表現に便利
2の補数表現によるN[bit]の数の場合、 〜0〜
を扱うことができる。
この他に、2000年問題と、unix時間が1970年からの経過秒数で表現していることによる、 2038年問題を説明する。