ホーム » スタッフ » 斉藤徹 » 数値の範囲と型

2013年4月
« 3月   5月 »
 123456
78910111213
14151617181920
21222324252627
282930  

最近の投稿(電子情報)

アーカイブ

カテゴリー

数値の範囲と型

構文,変数の話をしたので、続いては数値範囲について解説。

変な動きのプログラム例

(( 平均を求める処理 ))
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年問題を説明する。