[#44310] プログラムに対して意図したとおりの文字列を渡す方法 — "Information Kanasansoft" <kanasansoft@...>

kanasanです。

9 messages 2007/12/05

[#44332] クラス:相互参照系の作成方法について質問です — "Saburoh Sakai" <sabroh@...>

はじめまして、さかいと申します。

12 messages 2007/12/11

[#44366] Rake改善プロジェクト — "Hajime Hoshi" <hajimehoshi@...>

東京大学修士 1 年の星一と申します。

14 messages 2007/12/19

[ruby-list:44394] Re: typedef unsigned long VALUE; に関して

From: <cruby47@...>
Date: 2007-12-26 19:21:05 UTC
List: ruby-list #44394
なかむら(う)さん、ありがとうございます。

 こんにちは、なかむら(う)です。

In message "[ruby-list:44392] typedef unsigned long VALUE;  に関して"
    on Dec.27,2007 02:46:36,  wrote:
|  何か、重要な理由がありVALUEはvoid型のポインタとしては
|  定義されていないと思うのですが、自分で考えていてもなかなか
|  思いつかないので、そこの所を教えて頂けないでしょうか。

C言語では、ポインタとそれを格納しうる大きさの整数型との間の型
変換は認められていますが、実際にどのように変換されるかは処理
系定義となっています。
よって、整数型からポインタ型への変換時、あるいは、ポインタ型
から整数型への変換時に、値(ビットパターン)が変化する可能性が
あります。
具体的には、例えば、あるアドレスを指すポインタの表現形式が複
数ありえる場合(セグメント+オフセット形式であるとか、上位のビ
ットがアドレス値として無意味な場合など)、変換の過程で一定の表
現形式に揃える(正規化する)、という処理系実装が考えられます。

よって、任意の整数値をポインタに変換し、それを後で整数型に再
び変換しても、同じ値が得られるとは限りません。
もちろん、逆に任意のポインタを整数型に変換し、それを後でポイ
ンタに再び変換しても同じ値が得られるとも限らないのですが、実
用上、仮に異なるビットパターンになっていたとしても、おそらく
は同じアドレスを指すポインタになっている可能性は高いと考えら
れます。
と、いうわけで、VALUEをポインタ型として定義するのは危険ですが、
整数型として定義するのはそれよりはマシであろうことが期待でき
ます。


それでは。
-- 
U.Nakamura 



  なるほど、処理系の実装によっては期待した結果が得られない
 という事ですか。
 教えて頂いた事を参考にしてCの規格書(JIS X3010)に目を通して
 みたら、確かに以下のような記述がありました。
 
 
 -- 以下 JIS X3010:2003 (ISO/IEC 9899: 1999) より引用 --
 
 6.3.2.3 ポインタ
 
 整数は任意のポインタ型に型変換できる。これまでに規定されて
 いる場合を除き,結果は処理系定義とし,正しく境界調整されて
 いないかもしれず,被参照型の実体を指していないかもしれず,
 トラップ表現であるかもしれない。
 
 任意のポインタ型は整数型に型変換できる。これまでに規定されて
 いる場合を除き,結果は処理系定義とする。結果が整数型で表現
 できなければ,その動作は未定義とする。結果は何らかの整数型
 の値の範囲に含まれているとは限らない。
 
 --
 
 
 またひとつ勉強になりました。
 ありがとうございました。 

 
---------------------------------
Easy + Joy + Powerful = Yahoo! Bookmarks x Toolbar

In This Thread

Prev Next