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でポインタの格納ができなくなってしまいました。これは互換性という点では非常に大きな問題で、結果プログラムの書き直しが必要になってしまった、という訳です。
以上、お詫びして訂正いたします。