1. 位运算符,如果运算对象是带符号的且它的值为负,那么位运算符如何处理运算对象的“符号位”依赖于机器。此时左移操作可能会改变符号位的值,因此是一种UB。
Best Practices: 关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算用于处理无符号类型。
Bitwise Operators (Left Associative)
1.1
<<(左移),>>(右移)的右侧运算符对象一定不能为负,而且值必须严格的小于结果的位数,否则将产生UB。
err eg:
int test=0x1234; test <<=-1;//移动位数为负 *UB* //在int 为4字节32位的机器上 test >>=32;//右移32位,错误,范围0-31
1.1.1
左移运算符在右侧插入值为0 的二进制位,右移运算符的行为则依赖于左侧运算对象的类型,无符号类型,右移在左侧插入0的二进制位,有符号类型,在左侧插入符号位的副本或者值为0的二进制位。
summary:
见上Best Practices。
题外话:
如果在大型程序中某些程序由很多人开发而来,且其中一些贯穿全局的变量为有符号的,而你的开发又确实需要进行右移操作,那么你应该测试你当前环境的右移行为是什么样的并给予备注,提醒后来的开发维护人员。