【发布时间】:2012-03-17 11:56:13
【问题描述】:
n3337.pdf 草案 5.3.1.8 指出:
一元
-运算符的操作数应具有算术或无范围枚举类型,结果是其操作数的否定。对整数或枚举操作数执行整数提升。无符号量的负数是通过从 2ⁿ 中减去它的值来计算的,其中 n 是提升的操作数中的位数。结果的类型是提升操作数的类型。
在某些情况下就足够了。假设 unsigned int 是 32 位宽,那么 (-(0x80000000u)) == 0x80000000u,不是吗?
不过,我在无符号 0x80000000 上找不到任何关于一元减号的信息。此外,C99 标准草案 n1336.pdf, 6.5.3.3 似乎对此一无所知:
一元 - 运算符的结果是其(提升的)操作数的负数。对操作数执行整数提升,结果具有提升的类型。
UPDATE2:假设 unsigned int 是 32 位宽。所以,问题是:C 中的一元减号(有符号和无符号)和 C++ 中的一元减号(仅有符号)呢?
UPDATE1:运行时行为和编译时行为(即常量折叠)都很有趣。
【问题讨论】:
-
你的意思是你在 signed 0x80000000 上找不到任何关于一元减号的信息吗?
-
一般编译器会简单的生成一个合适的CPU操作码(比如x86
NEG)。标准措辞只是试图正式描述实际发生的情况。 -
@GregHewgill:我认为问题的关键在于 C99 标准没有描述会发生什么。
-
我不明白你在问什么。一元 - 在大多数平台上,0x80000000 等于 0x80000000,因为 0x100000000 - 0x80000000 = 0x80000000。
-
@sth c99 标准似乎对极端情况一无所知,即: 6.5.3.3.3:一元 - 运算符的结果是其(提升的)操作数的负数。对操作数执行整数提升,结果具有提升的类型。
标签: c++ c standards unary-operator