【发布时间】:2015-08-15 15:55:15
【问题描述】:
在当今的大多数实现中,符号位的位模式为 1,值位的位模式为全 0 的有符号整数值往往代表该有符号整数类型的最低可能值。
但是,正如6.2.6.2p2 所说,这不是必需的:
这些应用中的哪一个是实现定义的,无论符号位为 1 且所有值位为零(对于前两个),还是符号位和所有值位为 1(对于一个补码)的值是陷阱表示或正常值。
我的第一个问题很简单:是否有任何实现将此位模式用于负零或陷阱表示?如果这个问题的答案是“否”,那么我的后续问题的答案也必须是“否”。
继该问题之后,6.2.6.2p3 指出,当将负零分配给对象时,它可能(或可能不会)转换为常规零:
未指定这些情况实际上是生成负零还是正常零,以及当存储在对象中时负零是否变为正常零。
我的后续问题:
- 是否有任何实现使用陷阱表示而不是该位模式的负零?
- 是否有任何实现使用存储为不同值的负零?
- 是否有任何使用存储为常规零的负零的实现?
编辑澄清:我不询问在使用补码、二进制补码或有符号整数的符号和幅度表示的系统中理论上可能发生什么。我可以在本问题前面引用的部分中找到(并且已经找到)该信息。我问的是实际做了什么。
【问题讨论】:
-
One's complement 具有不同的负零位模式。
-
我相信 OS 2200 上的 UCS(在 Unisys Clearpath Dordado 大型机上,它们是一个补码机器)是使用一个补码的 C 实现,其中 +ve 和 -ve zero 是单独的位模式。跨度>
-
@undefinedbehaviour 不,我只是在 cmets 中回答您问题的第 2 点 :)
-
@undefinedbehaviour 没有可能。一个补码有两个零:一个正数和一个负数。全零位模式为正零,全一位模式为负零。
-
@orlp 我会为您简化...您可以在上面找到与有符号整数表示相关的 C 标准部分。在这个问题中,我已经两次链接到它。请不要回复,除非您有引用(来自 C 标准,因为这里没有其他相关内容)支持您的声明,或者准备停止做出不光彩和无效的断言。