【发布时间】:2020-05-01 17:54:06
【问题描述】:
C++11 标准是否保证零值有符号整数的一元减号为零?
例如:
int zero = 0;
int n = -zero;
int m = -0;
assert(memcmp(&n, &zero, sizeof(int)) == 0);
assert(memcmp(&m, &zero, sizeof(int)) == 0);
我知道 -0 和 0 在二进制补码表示中是相同的,但我想知道标准是否允许有符号整数零的否定对于其他表示为负零,例如一个恭维或符号量级。
我在 C++11 草案中只能找到 §5.3.1 第 8 段:
一元运算符的操作数应具有算术或无作用域 枚举类型和结果是其操作数的否定。 对整数或枚举操作数执行整数提升。 无符号量的负数是通过减去它的 来自 2^n 的值,其中 n 是提升的操作数中的位数。 结果的类型是提升操作数的类型。
我在草稿中找不到否定的定义。
动机:我正在为一个库编写一个专门的整数解析器(最终可能是开源的),我想知道我是否应该担心"-0" 的可能性在不常见的架构上被解释为负零有符号整数。
注意:我已经知道负零浮点数。
【问题讨论】:
-
-0 在汇编中不存在,一旦设置了有符号位,x86/x64 中就没有零值。无论如何,好问题。
-
我不知道
zero是否根据规范被视为“无符号数量”,即使zero的数据类型是有符号的。 -
在 C++ 级别可能会定义它,但如何实现呢?您发布的代码将在程序集生成中将 0 和 -0 设置为相同的值。在机器级别没有-0。
-
任何在底层使用二进制补码的系统都没有内部方法来表示负零,最后我听说二进制补码无处不在,几乎是普遍的。
-
C 标准指定了一组有限的操作,可能产生负零。一元
-不在该集合中。 (请参阅n1570 6.2.6.2 第 3 段。)我在 C++11 标准中看不到任何类似的措辞。在 C 中,负零 是一种表示,而不是一个值,它与普通零比较。 (当然它不存在于 2 的补码中。)
标签: c++ c++11 integer arithmetic-expressions unary-operator