64ビットがわかる 正誤表

P76
【誤】 DLL(Dynamic Load Library:動的ロードライブラリ)
【正】 DLL(Dynamic Link Library:動的リンクライブラリ)

P176
【誤】 DDR-?メモリ
【正】 DDR-Uメモリ

P154-155
ここについては、間違いというわけではないのですが、いささか言葉足らずな部分があったので補足します。
【誤】 C/C++の規則ではlongという型は(CPUによらず)32bit固定
【正】 C/C++の規則ではlongという型は、32bitまでは(CPUによらず)32bit固定

以下もう少し補足を。

元になる規則はK&R(カーニハン&リッチー)の「プログラミング言語C」に含まれるものと思われます。手持ちの第2版(ANSI規格準拠、ISBN4-320-02483-4)のP44では
「shortとintは少なくとも16bit、longは少なくとも32bit、shortはintより長くてはならず、intはlongよりも長くてはいけない」
と記述されています。この結果、8bit/16bit/32bitのCPUにおいて、コンパイラは

short int long
8bit 16bit 16bit 32bit
16bit 16bit 16bit 32bit
32bit 16bit 32bit 32bit

という領域の取り方をしていました。
さて問題は64bitです。早くから「64bit時代になるとこれじゃまずいね」という話はなされていました。当時(80年〜90年)のプログラミング作法において、「intというのは処理系によって変わるけれど、longはそのCPUで表現できる最大の値」ということになっており、この結果例えば「ポインタを格納するときに、intだと不足するかもしれないので、longを使え」という決まりごとがありました。中にはコーディングルールでこれを強制するプロジェクトすらありました。これは64bit世代になると

short int long
64bir 16bit 32bit or 64bit 64bit

となることを予定していたからで、事実UNIX系はこれを踏襲したI32LP64を実装したものが圧倒的多数です。こうしたものは、既存の32bit環境からコンパイルしなおしだけで64bitに移行できました。

ところがWindowsはIL32P64を実装したため、longでポインタの格納ができなくなってしまいました。これは互換性という点では非常に大きな問題で、結果プログラムの書き直しが必要になってしまった、という訳です。

以上、お詫びして訂正いたします。


Topに戻る