[解決済み] トラップ表現
質問
-
C言語における"trap representation"とは何ですか(いくつかの例が役に立つかもしれません)?これは C++ に適用されるのでしょうか?
-
このコードが与えられると...
float f=3.5; int *pi = (int*)&f;
... と仮定すると
sizeof(int) == sizeof(float)
を行う。f
そして*pi
は同じバイナリ表現/パターンを持つのでしょうか?
どのように解決するのですか?
-
トラップ表現は、C99 で使用されるキャッチオールな用語で (IRC、C89 では使用されません)、型によって占有されるスペースに適合するが、その型の値として使用すると未定義の動作を引き起こすビットパターンを記述するために使用されます。 定義はセクション6.2.6.1p5(6.2.6全体に触手を伸ばしている)にあり、長くてわかりにくいのでここでは引用しない。 このようなビットパターンが存在する型は、トラップ表現を持つ("have")と言われています。 どの型もトラップ表現を持つ必要はありませんが、規格が保証している唯一の型は ではなく がトラップ表現を持つことを保証する唯一の型は
unsigned char
になります (6.2.6.1p5, 6.2.6.2p1).規格では、トラップ表現の 2 つの仮説的な例を挙げていますが、どちらも実際の CPU が長年行ってきたことに対応しないため、混乱させるつもりはありません。 A 良い トラップ表現の例 (これも だけ の例では、浮動小数点型の信号 NaN がトラップ表現 (遭遇する可能性のあるすべての CPU でハードウェアレベルのトラップ表現として適格なもの) となります。 C99 Annex F (セクション 2.1) は、IEC 60559 がその動作を詳細に指定しているにもかかわらず、シグナリング NaN の動作を明示的に未定義のままにしています。
言及する価値があるのは、ポインタ型 は はトラップ表現を持つことが許されていますが、ヌルポインタは ではなく トラップ表現ではありません。 Null ポインタは、デリファレンスまたはオフセットされた場合にのみ未定義の動作を引き起こし、それ以外の操作(最も重要な比較とコピー)は適切に定義されています。 トラップ表現では、単に 読む トラップ表現は、トラップ表現を持つ型を使用してそれらを読み取るだけで、未定義の動作を引き起こします。 (トラップ表現を持つ 無効 が NULL でないポインタがトラップ表現とみなされるか、またはみなされるべきかは、議論の余地があります。 CPU はそのように扱わないが、コンパイラーはそのように扱うかもしれない)。
-
あなたが示したコードには未定義の動作がありますが、これはポインタエイリアスのルールのためであり、トラップ表現のためではありません。 これは
float
をint
を同じ表現で表現する(と仮定すると、おっしゃるようにsizeof(float) == sizeof(int)
)int extract_int(float f) { union { int i; float f; } u; u.f = f; return u.i; }
このコードには 不特定 (未定義ではない) 動作であり、基本的に標準では どのような整数値 が生成されるのですが、その際に いくつかの のような有効な整数値であれば、トラップ表現ではないので、コンパイラはこれをやっていないことを前提に最適化することは許されません。 (セクション 6.2.6.1, パラ7. 私の C99 のコピーには技術的な修正案が含まれているかもしれませんが、私の記憶では、この でした。 は元の出版物では未定義でしたが、TC で未定義に変更されたと記憶しています)。
関連
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] Interopタイプの組み込みができない
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】CとC++におけるユニオンの目的