* ビット幅独立なコード
-(by [[K]], 2018.07.15)
** (1)
-たとえば以下のようなプログラムを考えてみる。
int i, s = 0;
for (i = 1; i <= 100; i++)
s += i;
printf("%d\n", s);
-このプログラムはintが16ビット以上であれば(より厳密には14ビット以上であれば)、いつも同じ結果を返す。intが32ビットでも64ビットでも256ビットでも同じだ。
-一方で、以下のプログラムを考えてみる。
int i, s = 1;
for (i = 0; i < 32; i++)
s <<= 1;
for (i = 0; i < 32; i++)
s >>= 1;
int i, s = 0;
for (i = 1; i > 0; i <<= 1)
s++;
printf("%d\n", s);
-このプログラムはintのビット幅によって結果が異なる。
-CPUを作る人の気持ちになってみると、たとえば64ビットのCPUを作るとして、8ビット命令や16ビット命令や32ビット命令を作りたいだろうか?すべての演算命令にそんなにバリエーションがあったら実にめんどくさいと私なら思う。だからそんなものは作らずに済ませたい。とすると、ビット幅で結果が変わるようなプログラムは書かれるべきではない。
-先のシフトによるループにしても、加算するたびに0x7fffffffをANDするようにすれば、32ビット以上では同じ結果になるようになる。