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

时间:2015-06-02 02:09:54

标签: c c99 c11

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

然而,正如6.2.6.2p3所述,这不是一项要求:

  

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

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

继续该问题后,{{3}}指出当一个负零被分配给一个对象时,它可能(或可能不会)被转换为常规零:

  

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

我的后续问题:

  1. 是否有任何实现使用陷阱表示而不是该位模式的负零?
  2. 是否有任何使用负零的实现存储为不同的值?
  3. 是否有任何使用负零的实现存储为常规零?
  4. 编辑以澄清:我 NOT 询问在使用补码,二进制补码或有符号整数的符号和幅度表示的系统中理论上可行的内容。我可以在本问题前面引用的章节中找到(并且已经找到)这些信息。我问的是实际做了什么

1 个答案:

答案 0 :(得分:1)

正如评论中Iskar Jarak提请我注意的那样,最近于2015年2月发布的OS2200有一个名为 UCS C 的C实现,其中the manual个文件

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

总之,......

  

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

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

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

关于问题3,要在另一天回答......我的时间已到此结束:)