c17 6.2.6.2/4说:
如果实现不支持负零,则&,|, ^,〜,<< ,, >>具有产生这种价值的操作数的操作员是不确定的。
如果我有一个2的补体系统,则不支持负零。它始终利用二进制数的所有可能组合来表达值。因此,无论使用哪种位操作,都不可能产生负零。那么本文的含义是什么?
我的看法是,该部分是指具有1的补充或签名幅度的系统,该系统不支持负零,而是使用填充位或陷阱表示。这是正确的吗?
是的,我认为您的解释是正确的。在两者的补充中,没有可能会产生负零的操作,因为这里的概念不存在:任何具有标志位集的值都必须小于0
。
btw:很有可能从C2X中删除外来符号表示形式,因此所有这些都会消失。
您的解释正确。
上升到6.2.6.2段:
对于签名的整数类型,对象的位 代表应分为三组:价值位, 填充钻头和标志位。不需要任何 填充钻头;签名的char不得有任何填充物。 应该有一个标志。每一点 值位应具有与同一位相同的值 对应的无符号类型的对象表示(如果有 M值位在签名类型中,无符号类型中的N,然后M≤N )。如果符号位为零,则不会影响结果 价值。如果符号位是一个,则应修改该值 以以下方式之一:
- 否定了带有标志位0的相应值(符号和大小);
- 符号位具有值 - (2 m )(两个补充);
- 符号位具有值 - (2 m - 1)(一个补充)。
以下哪一个是实现定义的,是否 符号位1和所有值位为零(第一个值) 两个),或带有符号和所有值位1(对于那些 补体),是陷阱表示或正常值。在 如果这样 表示为正常值,称为负零。
这意味着使用一个人的补充或符号和大小的实现,对于给定的大小整数类型,特定表示,必须为负零或陷阱表示。然后,要选择使用哪种适用的实施。
作为一个例子,假设系统具有符号和幅度表示形式,而没有填充的32位int
。然后,如果支持的(如果支持)为负零的表示为 0x80000000
。
现在假设执行以下操作:
int x = 0x7fffffff;
x = ~x;
如果实现支持负零,则~
操作员将生成-0
作为结果,并将其存储在x
中。如果没有,它将创建陷阱表示形式,并根据第4段调用不确定的行为。