C++ 对位移位行为的质疑

C++ 对位移位行为的质疑,c++,language-lawyer,c++17,bit-shift,C++,Language Lawyer,C++17,Bit Shift,我想澄清一些关于钻头移位的疑问: 使用无符号整数: 无符号整数i=500 i31 那是溢油吗 C++17(8.5.7/3)E1>>E2的值是E1右移位的E2位位置。如果E1有 无符号类型,或者如果E1具有有符号类型和非负值, 结果的值是的商的整数部分 E1/2^E2 这很好吗 对i将变为4093640704,十六进制0xF40000 那是溢油吗 否。这是右移(类似除法的操作),因此i将变为零 注意,关于移位的规则很可能会改变。目前,有几种情况是未定义的行为或实现定义的。由于下一个标准将需

我想澄清一些关于钻头移位的疑问:

  • 使用无符号整数:

    无符号整数i=500
    i31

  • 那是溢油吗

    C++17(8.5.7/3)E1>>E2的值是E1右移位的E2位位置。如果E1有 无符号类型,或者如果E1具有有符号类型和非负值, 结果的值是的商的整数部分 E1/2^E2

  • 这很好吗

    对<代码>i
    将变为
    4093640704
    ,十六进制
    0xF40000

  • 那是溢油吗

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


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

    没有
    未签名的
    溢出。当
    无符号
    值发生溢出时,该数字将按+1类型的最大值进行模减。有符号溢出。
    signed
    溢出。如果左移一个负值,或者左移一个正符号值溢出,则该溢出也是未定义的。@interjay:你的意思是,在当前的标准草案中?(我说的是当前的草稿)在C++17中,这是否意味着正
    有符号
    整数上的右移定义良好?我想如果值不可表示,则正数'signed'integer上的左移位是不可表示的。我指的是最近发布的标准C++17(问题标记为)。我不知道最新的草案中是否有变化。“在C++17中,这是否意味着正符号整数上的右移定义良好?”是的。“如果值不可表示,则假定正‘有符号’整数上的左移位是不可表示的。”如果结果在无符号版本中不可表示,则仅为UB。因此,转移到符号位是好的(实现定义的),但转移更多不是好的。但这些规则不再重要,因为下一个草案简化了它们,因为它需要两个补码。