【发布时间】:2019-08-23 10:15:24
【问题描述】:
在当前的C++标准草案中,左移运算符定义如下[expr.shift]:
E1 << E2的值是唯一值,与E1×2^E2模2^N一致,其中N是结果类型的宽度。
考虑具有 32 位的 int E1 = 2^31-1 = 2'147'483'647、E2 = 1 和 int。然后有无限个数与E1×2^E2 = 4'294'967'294 模2^N = 2^32,即所有数4'294'967'294 + k×2^32,其中k 是任意整数。例如4'294'967'294 (k=0) 或-2 (k=-1)。
我不明白这些数字中独特价值的标准是什么意思。这是否意味着可以由结果数据类型表示的唯一值?然后,我想结果被定义为-2。这种解释正确吗?
在 C++20 之前,定义是不同的,这种情况会导致未定义的行为。我想这种变化与负符号整数的强制性 2 补码表示有关。
事实上,现在不再要求E1 为非负数。因此,-1 << 1 似乎被定义为-2。也是这样吗?
【问题讨论】:
-
“事实上,现在不再要求
E2为非负数”。在您提供的链接中,有注释“如果右操作数为负,则行为未定义”。你的意思是E1,就像你给出的例子一样?或者,自从您发布问题后,情况可能发生了变化? -
@deltacrux 打错字了,谢谢提醒。
-
没问题,感谢您的澄清!
标签: c++ language-lawyer bit-shift c++20