当你移位到变量的末尾时会发生什么?

如果你有一些变量(在堆栈上),你左或右位移超过它的结束会发生什么?

byte x = 1; x >> N; 

如果x是指向一个字节的内存的指针并且你做同样的事情怎么办?

 byte* x = obtain pointer from somewhere; *x = 1; *x >> N; 

它(必然)不会变为零。 行为未定义(C99§6.5.7,“按位移位运算符”):

如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。

(C ++0x§5.8,“Shift运算符”):

如果右操作数为负数,或者大于或等于提升左操作数的位长度,则行为未定义。

被移位的值的存储对任何这一点都没有影响。

我觉得你对于什么是位移机做的很困惑。 它们是算术运算符,相当于乘法或除以2的幂(以C为单位处理负数的模数)。 它们不会移动内存中的任何位 。 任何变量/内存的内容改变的唯一方法是将表达式的结果分配回某处。

至于当bitshift运算符的右手操作数大于或等于左手表达式类型的宽度时会发生什么,行为是未定义的。

我觉得你很困惑。 x >> y 实际上并不首先改变x 。 它计算一个新值。

正如斯蒂芬所指出的那样, y不能是负数,它必须小于“提升左操作数的宽度”(阅读类型提升)。 但是,否则,“从末端”移位的位被简单地丢弃。 1 >> 2 (注意2不是负数,并且它小于用于表示1的位数,可能是32但肯定至少为16)的计算结果为0。

你得零。 没有包装到其他内存位置。 你也可以清除它。

它变得全是零。 所以不管它的长度是多少都是零。

也就是说二进制是001,在3位移位之后它只是000.没有环绕发生并且它不移动位置(除非你有点移位指针本身然后我不知道)。