C17 6.2.6.2/4表示:
如果实现不支持负零,则&,,^,~,<和>>未定义具有操作数的运算符,这些操作数将产生这样的值。
如果我有一个2的补码系统,它不支持负零。它总是利用二进制数的所有可能组合来表示一个值。因此,无论使用哪种位运算,都不可能产生负零。那么这篇文章的意思是什么?
我的看法是,这一部分指的是具有1的补码或有符号大小的系统,这些系统不支持负零,而是使用填充位或陷阱表示。这是对的吗?

最佳答案

你的解释是正确的。
至6.2.6.2第2段:
对于有符号整数类型,对象的位
表示应分为三组:值位,
填充位和符号位。没有必要
填充位;有符号字符不能有任何填充位。
应该只有一个标志位。每一位都是
值位的值应与
对应无符号类型的对象表示(如果有
有符号类型的m值位和无符号类型的n值位,则m≤n
)中。如果符号位为零,则不会影响结果
价值。如果符号位为1,则应修改该值
以下列方式之一:
符号位为0的对应值取反(符号和大小);
符号位的值为–(2m)(2的补码);
符号位的值为–(2m–)1(1的补码)。
其中哪一个适用于实现定义,以及
符号位为1,所有值位为0的值(第一个
两个),或带符号位和所有值位1(对于一个
补码),是陷阱表示或正常值。在
符号、量和一的补码的情况,如果是这样的话
表示法是一个正常值,称为负零。
这意味着对于给定大小的整数类型,使用补码或符号和大小的实现具有特定的表示形式,该表示形式必须为负零或陷阱表示。然后由实现来选择哪个应用程序。
例如,假设系统具有符号和幅度表示,并且32位int没有填充。如果支持负零的表示,则表示为0x80000000
现在假设执行以下操作:

 int x = 0x7fffffff;
 x = ~x;

如果实现支持负零,~运算符将生成-0作为结果并将其存储在x中。如果没有,它将创建一个陷阱表示,并根据第4段调用未定义的行为。

07-24 09:46