首页 > 解决方案 > 对移位行为的怀疑

问题描述

我想澄清一些关于位移的疑虑:

  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 的商的整数部分。

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

解决方案


  1. 这完全没问题吗?

    是的。i将变为4093640704十六进制0xf4000000

  2. 那是溢出吗?

    不,这是一个右移(类似除法的操作),所以i会变为零。

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


推荐阅读