C 中的陷阱表示:详细阐述
什么是陷阱表示?
C99引入术语“陷阱表示”来描述占用类型大小但触发的位模式如果用作该类型的值,则行为未定义。这些模式的存在是可选的,除了 unsigned char 之外,它保证避免它们。
陷阱表示的一个示例是浮点类型中的信号 NaN。尽管 IEC 60559 指定了其处理方式,但其行为在 C99 中未定义。
空指针和陷阱表示
虽然指针类型可以拥有陷阱表示,但空指针却不能认为是这样的。仅当取消引用或偏移它们时,才会出现未定义的行为。另一方面,陷阱表示在使用其代表性类型进行简单读取操作时会导致未定义的行为。
未定义行为与陷阱表示
您提供的代码显示未定义由于指针别名规则而不是陷阱表示而产生的行为。要将 float 正确转换为具有相同表示形式的 int,请使用以下代码片段:
int extract_int(float f) { union { int i; float f; } u; u.f = f; return u.i; }
此代码在 C99 中表现出未指定的行为,其中未定义生成的确切整数值,但它是一个有效的整数结果有保证。它不是陷阱表示,并且无法基于其不存在的假设进行优化。
以上是C 中的陷阱表示是什么以及它们与未定义行为有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!