C では、トラップ表現は、データ型のメモリ割り当て内に収まるビット パターンを指します。ただし、その値として解釈されると未定義の動作がトリガーされますtype.
トラップ表現の一般的な例の 1 つは、浮動小数点型でのシグナル NaN (Not a Number) です。 C99 標準では、シグナル伝達 NaN の動作が他の標準で明確に規定されているにもかかわらず、未定義として明示的に定義されています。
トラップ表現は C にも適用できます。ただし、C では、C で未定義の動作を引き起こす一部の操作を防ぐ追加の型安全メカニズムが導入されていることに注意することが重要です。
提供されるコード スニペットでは、次のようになります。
float f = 3.5; int *pi = (int*)&f;
sizeof(int) == sizeof(float) と仮定すると、f と *pi は同じではありませんバイナリ表現。ポインター キャストを使用して float から int に変換すると、ポインターのエイリアシング ルールにより未定義の動作が発生します。 float の整数表現を正しく抽出するには、次のアプローチを使用する必要があります。
int extract_int(float f) { union { int i; float f; } u; u.f = f; return u.i; }
このコードは C99 では未指定の動作をしますが、トラップ表現ではない有効な整数値を生成します。
以上がC のトラップ表現とは何ですか? C ではどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。