对位转移行为的怀疑

Doubts on bit-shifting behavior

本文关键字:怀疑 转移      更新时间:2023-10-16

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

  1. 使用unsigned int

    unsigned int i = 500;
    i << 24;

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

c 17(8.5.7/2( - e1&lt;&lt;E2是E1左移E2位位置;空缺 钻头充满零。如果E1具有未签名类型,则 结果是E1×2^e2,比最大值还要降低一个比最大值多。 在结果类型中表示。

  1. 只要我的移动少于32位',就可以在signed int上使用右移,因为" int"在我的平台上是32位。

    int i = 500;
    i >> 31;

是溢出吗?

C 17(8.5.7/3(E1>> E2的值是E1右移动E2位位置。如果E1有 未签名类型,或者E1具有签名类型和非负值, 结果的价值是商的组成部分 e1/2^e2。

  1. 这很好吗?

    是。i将成为4093640704,在十六进制的0xf4000000中。

  2. 是溢出吗?

    否。这是一个正确的偏移(类似于分区的操作(,因此i将变为零。

请注意,有关班次的规则很可能会改变。当前,有几种情况是未定义的行为或实施定义。由于下一个标准将需要两个的补充算术,因此有关转移的规则将放松:唯一的不确定行为是,如果移位量大于或等于类型的宽度。这是当前的草案规则:链接。