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代码>
4093640704
,十六进制0xF40000
i
将变为零
注意,关于移位的规则很可能会改变。目前,有几种情况是未定义的行为或实现定义的。由于下一个标准将需要两个补码运算,有关移位的规则将被放宽:如果移位量大于或等于类型的宽度,则唯一未定义的行为将是。以下是当前的规则草案:。没有
未签名的溢出。当无符号
值发生溢出时,该数字将按+1类型的最大值进行模减。有符号溢出。signed
溢出。如果左移一个负值,或者左移一个正符号值溢出,则该溢出也是未定义的。@interjay:你的意思是,在当前的标准草案中?(我说的是当前的草稿)在C++17中,这是否意味着正有符号整数上的右移定义良好?我想如果值不可表示,则正数'signed'integer上的左移位是不可表示的。我指的是最近发布的标准C++17(问题标记为)。我不知道最新的草案中是否有变化。“在C++17中,这是否意味着正符号整数上的右移定义良好?”是的。“如果值不可表示,则假定正‘有符号’整数上的左移位是不可表示的。”如果结果在无符号版本中不可表示,则仅为UB。因此,转移到符号位是好的(实现定义的),但转移更多不是好的。但这些规则不再重要,因为下一个草案简化了它们,因为它需要两个补码。