C のトラップ表現の詳細: 未定義の動作を理解する
C プログラミングでは、「トラップ表現」とは、以下のビット パターンを指します。特定のデータ型が占めるメモリ空間内で使用されますが、その型の値として使用されると未定義の動作が引き起こされます。 C89 では明示的に定義されていませんが、この用語は C99 で導入され、そのようなビット パターンを包括するものとして機能します。
トラップ表現の存在は、すべてのデータ型に対して保証されているわけではありません。実際、標準では、トラップ表現を持たないことが保証されている型は unsigned char だけであると明示的に規定されています。ただし、ここではトラップ表現の 2 つの仮想的な例を示していますが、これらは現代のコンピューティングの実践ではほとんど無関係です。特に、トラップ表現のより実用的な例は、浮動小数点型でのシグナル NaN (Not-a-Number) です。
コード スニペットに関しては、float 変数が int ポインターに変換されます。
float f=3.5; int *pi = (int*)&f;
sizeof(int) と sizeof(float) が等しいと仮定すると、このコードにはポインターが原因で未定義の動作があることに注意することが重要です。エイリアシングルール。これはトラップ表現とは関係ありません。
浮動小数点値の整数表現を正しく抽出するには、次のコードを使用できます。
int extract_int(float f) { union { int i; float f; } u; u.f = f; return u.i; }
このコードは共用体を使用して浮動小数点値を解釈します。整数として指定されます。これにより、C99 では未指定の動作が提供されます。返される正確な整数値は定義されていませんが、有効な整数値が保証され、トラップ表現が回避されます。
以上がC のトラップ表現とは何ですか?また、Float の整数表現に安全にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。