在当今时代的大多数实现中,符号位的位模式为 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.
我的后续问题:
- 是否有任何实现使用陷阱表示而不是该位模式的负零?
- 是否存在使用负零作为不同值存储的实现?
- 是否有任何实现使用将负零存储为常规零?
编辑以澄清:我不是询问在使用有符号整数的补码、补码或符号和大小表示的系统中理论上可能发生的情况。我可以在这个问题前面引用的部分中找到(并且已经找到)该信息。我问的是实际做了什么。
最佳答案
正如 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/