对移位行为的怀疑

时间:2019-05-25 09:16:59

标签: c++ language-lawyer c++17 bit-shift

我想清除一些有关移位的疑问:

  1. 使用unsigned int

    unsigned int i = 500;
    i << 24;

    据我所知,这会导致unsigned int溢出,这完全可以吗?

  

C ++ 17(8.5.7 / 2)-E1 << E2的值是E1左移E2位的位置;空出   位为零。如果E1具有无符号类型,则   结果是E1×2 ^ E2,比最大值减少了模一   在结果类型中可以表示。

  1. 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。

1 个答案:

答案 0 :(得分:3)

  1.   

    这很好吗?

    是的。 i将变成4093640704,以十六进制的0xf4000000

  2.   

    那是溢出吗?

    不。这是右移(类除法操作),因此i将变为零。

请注意,有关转移的规则很可能会改变。当前,有几种情况是未定义的行为或实现的定义。由于下一个标准将需要二进制补码算法,因此将放宽有关移位的规则:如果移位量大于或等于类型的宽度,则唯一未定义的行为将是。以下是当前的规则草案:link