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

Per*_*rge 3 c c++ bit-manipulation

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

byte x = 1;
x >> N;
Run Code Online (Sandbox Code Playgroud)

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

byte* x = obtain pointer from somewhere;
*x = 1;
*x >> N;
Run Code Online (Sandbox Code Playgroud)

Ste*_*non 8

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

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

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

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

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

  • 呃......既不是"右操作数是否定的",也不是"右操作数大于或等于提升的左操作数的宽度",这一定就是这种情况.OP没有指定N的值.我把这个问题读作"我认为这里的值无关紧要,因为`x`是1". (4认同)

R..*_*R.. 5

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

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