実は、恥ずかしながらハードウエアに近い部分でのプログラミング経験がほとんどありません。そんなわけで、かなり会社では苦労しているのですが、金曜日にソースコードを見ていてすごい謎に思っていた部分に、「いやなブログ」がぴたっとはまる解説をしてくれていてとても助かりました。
- Cのポインタを整数に変換する
http://0xcc.net/blog/archives/000113.html
Cのポインタを整数に変換したいときがあります。このとき問題になるのは、ポインタのサイズが int と同じとは限らないということです。たとえば、 x86_64 の 64ビットのバイナリでは sizeof(int) = 4, sizeof(void *) = 8 となります。ポインタと同じサイズの整数を使いたい場合は C99 で導入された stdint.h で提供される intptr_t または uintptr_t を使います。
ここに書かれていたことと全くおなじことをやっていて、おもいっきりはまっていました。64bit CPUでびっくりするくらい何も考えず、いつもの感覚でuint32_t型でポインタを整数で受けており、メモリアドレスが合わずにメモリ参照ができなくてはまっていました。
私の場合、C++ のプログラムで void * から直接 uint64_t にキャストしようとしてはまりました。次のプログラムを x86_32 の環境でコンパイルして実行すると 80000000 ではなく、 ffffffff80000000 が表示されます。
まさしく、この状況です。もう、笑ってしまうくらい状況が一致しています。ついでですので、だれか、volatileと__attribute__(aligned(128))の説明もお願いします。