我想清除一些有关移位的疑问:
使用unsigned int
:
unsigned int i = 500;
i << 24;
据我所知,这会导致unsigned int
溢出,这完全可以吗?
C ++ 17(8.5.7 / 2)-E1 << E2的值是E1左移E2位的位置;空出 位为零。如果E1具有无符号类型,则 结果是E1×2 ^ E2,比最大值减少了模一 在结果类型中可以表示。
在signed int
上使用右移非常好,只要我的移动量小于'32位',因为平台上的'int'是32位。
int i = 500;
i >> 31;
那是溢出吗?
C ++ 17(8.5.7 / 3)E1 >> E2的值是E1右移E2位的位置。如果E1有 无符号类型,或者如果E1具有带符号类型和非负值, 结果的值是 E1 / 2 ^ E2。
答案 0 :(得分:3)
这很好吗?
是的。 i
将变成4093640704
,以十六进制的0xf4000000
。
那是溢出吗?
不。这是右移(类除法操作),因此i
将变为零。
请注意,有关转移的规则很可能会改变。当前,有几种情况是未定义的行为或实现的定义。由于下一个标准将需要二进制补码算法,因此将放宽有关移位的规则:如果移位量大于或等于类型的宽度,则唯一未定义的行为将是。以下是当前的规则草案:link。