n3337.pdf 草案 5.3.1.8 指出:
一元运算
-
符的操作数应具有算术或无范围枚举类型,结果是其操作数的否定。对整数或枚举操作数执行整数提升。无符号量的负数是通过从 2ⁿ 中减去其值来计算的,其中 n 是提升的操作数中的位数。结果的类型是提升的操作数的类型。
对于某些情况,这就足够了。假设 unsigned int 是 32 位宽,那么(-(0x80000000u)) == 0x80000000u
,不是吗?
尽管如此,我还是找不到关于 unsigned 0x80000000 上的一元减号的任何信息。此外,C99 标准草案 n1336.pdf, 6.5.3.3 似乎对此一无所知:
一元 - 运算符的结果是其(提升的)操作数的负数。整数提升在操作数上执行,结果具有提升的类型。
UPDATE2:让我们假设 unsigned int 是 32 位宽。所以,问题是:C 中的一元减号(有符号和无符号)和 C++ 中的一元减号(仅有符号)呢?
UPDATE1:运行时行为和编译时行为(即常量折叠)都很有趣。