c - 是否有任何支持负零或将其保留为陷阱表示的实现?

标签 c c99 c11

在当今时代的大多数实现中,符号位的位模式为 1、值位的位模式均为 0 的有符号整数值往往表示该有符号整数类型的最低可能值。

但是,如 6.2.6.2p2状态,这不是一个要求:

Which of these applies is implementation-defined, as is whether the value with sign bit 1 and all value bits zero (for the first two), or with sign bit and all value bits 1 (for ones' complement), is a trap representation or a normal value.

我的第一个问题很简单:是否有任何实现使用此位模式来表示负零或陷阱?如果这个问题的答案是“否”,那么我后续问题的答案也必须是“否”。

根据该问题,6.2.6.2p3指出当将负零分配给对象时,它可能(也可能不会)转换为常规零:

It is unspecified whether these cases actually generate a negative zero or a normal zero, and whether a negative zero becomes a normal zero when stored in an object.

我的后续问题:

  1. 是否有任何实现使用陷阱表示而不是该位模式的负零?
  2. 是否存在使用负零作为不同值存储的实现?
  3. 是否有任何实现使用将负零存储为常规零?

编辑以澄清:我不是询问在使用有符号整数的补码、补码或符号和大小表示的系统中理论上可能发生的情况。我可以在这个问题前面引用的部分中找到(并且已经找到)该信息。我问的是实际做了什么

最佳答案

正如 Iskar Jarak 引起我的注意在评论中,最近于 2015 年 2 月发布的 OS2200 有一个名为 UCS C 的 C 实现,其中 the manual第 2-29 页的文档:

  • 符合标准的 C 实现,其中 “...不使用 CONFORMANCE/TWOSARITH,在使用小于 (<) 或等于 (=) 的所有 36 位无符号整数比较中,负零相当于零.在使用大于 (>) 的无符号比较中,(236)-1 大于零。”
  • 一个符合问题的 C 实现,其中 “CONFORMANCE/TWOSARITH 导致负零 (236)-1,被生成的代码视为一个大的无符号整数。” 因为这违反了多个 C 标准条款(6.2.6.2p2 声明“符号位的值为 -(2M)(二进制补码)”>“符号位的值为 -(2M-1)(补码)”6.3.1.1p3 说明“整数提升保留包括符号在内的值”,与 UCS/OS2200 文档中指定的转换为一个大的无符号整数相矛盾),因此只有当负零位模式被视为陷阱表示时,这才可能符合,其中-通过调用未定义的行为,因此标准的约束不再适用。

总而言之,...

Are there any implementations that use this bit pattern for a negative zero or a trap representation?

是的。提供的示例可以将此位模式用于负零陷阱表示,具体取决于编译器一致性选项。


对于后续问题 1 和 2,OS2200 上的 UCS C 就是这两个问题的一个示例。

至于问题3,改天再回答...我的时间到这里就结束了:)<​​/p>

关于c - 是否有任何支持负零或将其保留为陷阱表示的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30586217/

相关文章:

c - free如何知道要释放的内存大小?

if 语句中的 OR 条件链

c - GNU89,混合声明和循环初始声明

C99 如何将简单指针转换为可变长度的多维数组?

c - 简单赋值运算符的原子性

c - 将 C 程序与标准线程(C11 中的 <threads.h>)链接的正确方法是什么?

c - c中的结构内部的函数指针有什么用?

c - 贪心算法返回的数量对于小值来说太大,但对于较大的值则不会

c - 如何使用 C99 实现和共享内联函数?

c - 为什么编译器在尝试修改 char * 字符串文字时不检测并产生错误?