Up

キャリーのチェック

Carry into/out of the sign bit

 

 コンピュータでは数値は有限の桁数で表されているため、正の整数値の計算結果が符号ビットに影響を与える(carry into the sign bit)あるいは符号ビットが消える(carry out of the sign bit)ことがある(J. F. Monahan, “Numerical methods of statistics”, 2010)。このことを確認するC++プログラムを以下のように作成してみた。

 

#include <iostream>

 

using namespace std;

 

int main(){

        short int i = 1;

        do{

                i *= 2;

                cout << i << endl;

        }while(i != 0);

        short int j = 0x7fff;

        cout << "j(0x7fff) = " << j << endl;

        j++;

        cout << "j++ = " << j << endl;

        short int k = 0x8000;

        cout << "k(0x80000) = " << k << endl;

        k *= 2;

        cout << "k*2 = " << k << endl;

        return 0;

}

 

上のプログラムをLinux(CentOS 5.5)で実行したときの端末画面の出力は以下のようになった。

 

[yasuharu@localhost CheckCarry]$ g++ -o checkCarry checkCarry.cpp

[yasuharu@localhost CheckCarry]$ ./checkCarry

2

4

8

16

32

64

128

256

512

1024

2048

4096

8192

16384

-32768

0

j(0x7fff) = 32767

j++ = -32768

k(0x80000) = -32768

k*2 = 0

[yasuharu@localhost CheckCarry]$

 

上の出力において

j++ = -32768

carry into the sign bitを表すものであり、

k*2 = 0

carry out of the sign bitを表すものである。

 上のプログラムのファイルcheckCarry.cppは、ファイル名checkCarry.cppをマウスの右ボタンでクリックしてダウンロードできる。

 

Up