From: "U.Nakamura" Date: 2007-12-27T03:36:32+09:00 Subject: [ruby-list:44393] Re: typedef unsigned long VALUE; に関して こんにちは、なかむら(う)です。 In message "[ruby-list:44392] typedef unsigned long VALUE; に関して" on Dec.27,2007 02:46:36, wrote: | 何か、重要な理由がありVALUEはvoid型のポインタとしては | 定義されていないと思うのですが、自分で考えていてもなかなか | 思いつかないので、そこの所を教えて頂けないでしょうか。 C言語では、ポインタとそれを格納しうる大きさの整数型との間の型 変換は認められていますが、実際にどのように変換されるかは処理 系定義となっています。 よって、整数型からポインタ型への変換時、あるいは、ポインタ型 から整数型への変換時に、値(ビットパターン)が変化する可能性が あります。 具体的には、例えば、あるアドレスを指すポインタの表現形式が複 数ありえる場合(セグメント+オフセット形式であるとか、上位のビ ットがアドレス値として無意味な場合など)、変換の過程で一定の表 現形式に揃える(正規化する)、という処理系実装が考えられます。 よって、任意の整数値をポインタに変換し、それを後で整数型に再 び変換しても、同じ値が得られるとは限りません。 もちろん、逆に任意のポインタを整数型に変換し、それを後でポイ ンタに再び変換しても同じ値が得られるとも限らないのですが、実 用上、仮に異なるビットパターンになっていたとしても、おそらく は同じアドレスを指すポインタになっている可能性は高いと考えら れます。 と、いうわけで、VALUEをポインタ型として定義するのは危険ですが、 整数型として定義するのはそれよりはマシであろうことが期待でき ます。 それでは。 -- U.Nakamura