ホーム » スタッフ » 斉藤徹 » 数値の範囲と負の数の取り扱い

2011年5月
« 4月   6月 »
1234567
891011121314
15161718192021
22232425262728
293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

数値の範囲と負の数の取り扱い

前回がN進数の話だったので、負の数の取り扱いや数値範囲について説明。 1byte 整数の話も含め、簡単に char 型の話をしたあと、 signed(符号あり) , unsigned(符合なし) , short int(通常16bit) , int(通常32bit) , long int(処理系によっては64bit) という型の数値範囲を説明する。

// 昔の16bitパソコンで動かない事例
//   640x480なモニタで、マウス座標とターゲットの距離
int distance( int x1,int y1, int x2,int y2 ) {
return sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) ;
}

上記のプログラムは、16bitパソコンでは動かない可能性がある。 x2,x1が200離れていただけでも、40000を超えた数値になり、(2^15-1)=32767 を超えてしまう。整数型で上限を超えた場合、符号ビットが1になる 状況では、本来なら2乗の和で負の数にはなりえないはずだけど、 負の数の平方根(sqrt)の処理より、異常終了となる。

// 32bitコンピュータで、int(32bit)でunix時間を扱う場合
int mid_time( int t1 , int t2 ) {
return (t1 + t2) / 2 ; // t1 + (t2 - t1)/2 と書くべき
}

この他に、2000年問題の話をしたあと、unix時間が1970年からの経過秒数であり、 時間を32bitで扱う場合、2037年には(2^31-1)を超えて時間の処理に 失敗擦る可能性を説明する。また、下記のような時間の「なか日」を求める 処理でも、1970年+(68年/2) = 2004年以降ではトラブルの原因となる。