是否存在支持负零的任何实现,或将其保留为陷阱表示?

在当前和年龄的大多数实现中,符号位的位模式为1且值位为0的有符号整数值往往表示该有符号整数类型的最低可能值。

但是,如6.2.6.2p2所述,这不是一项要求:

这些适用中的哪一个是实现定义的,就像符号位1和所有值位零(前两个),或符号位和所有值位1(对于补码)一样,是否为陷阱表示或正常值。

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

继该问题之后, 6.2.6.2p3指出当为对象分配负零时,它可能(或可能不)转换为常规零:

未指定这些情况是否实际产生负零或正常零,以及当存储在对象中时负零是否变为正常零。

我的后续问题:

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

编辑澄清:我不是要求在一个系统中理论上可行的是什么,该系统使用补码,二进制补码或有符号整数的符号和幅度表示。 我可以在本问题前面引用的章节中找到(并且已经找到)这些信息。 我问的是实际做了什么

正如Iskar Jarak在评论中引起我注意的那样,最近于2015年2月发布的OS2200有一个名为UCS C的C实现 ,其中包含手册文档

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

综上所述, …

是否存在将此位模式用于负零或陷阱表示的任何实现?

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


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

至于问题3,有一天要回答……我的时间已到此结束:)