変数のbit長

C言語に代表されるような関数型言語には、たいてい整数型(int型)がある。これが何bitであるかは言語系で違う。また処理系でも異なるかも知れない。

C言語では、int型は実装依存であり、その処理系でもっともパフォーマンスの優れているbit長である。ふつう、32bit CPUなら32bitだろうし、64bit CPUならば64bit(実際はintは32bitで、longとポインタを64bitにする処理系のほうが主流か?)、8bit CPUならば8 or 16bitであろう。

それに対して、Javaのようにint型は符号付き32bit固定と定められている言語系がある。むしろ、最近の流行としては、こちらが主流だ。このほうが、移植するときにややこしいことにならなくて済むという利点がある。Once Write,Run Anywhereを信条とするJavaは当然、処理系依存の要素があってはならない。

C#/D言語なんかもintは32bit型である。まあ、いまのところパソコン市場ではPentium4とかPentiumMとかがメインなので、これらが32bitプロセッサである限りにおいて、intが32bitであれば特に問題は起こらない。

ところが、64bitプロセッサではどうなのだろうか?64bitプロセッサにおいて

1.qword(64bit)境界にalignされていない32bitのデータにアクセスするのにペナルティがあるとすれば、基本的には64bitの変数を使ったほうがいい
2.64bit変数を多用することになるのなら、32bit変数との演算は符号拡張命令等が入る分だけオーバーヘッドがある(はず)

1.については、プロセッサ依存なのでどうなるのかはわからないが、2.は現実的に起こりそうだ。

そう考えると、Javaのようなintが32bit固定という取り決めは、むしろヤバイような気がしなくもない。本当は、ビット長を指定したい時は32bit無符号型整数ならばUint32とか、64bit符号型整数ならばInt64とかのように大文字で始まる型を用いて、最低限32bit以上の符号型変数が欲しいならばint32のように小文字で始まる型を使うとかするようにするべきだった気がしなくもない。