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

时间:2010-12-01 23:41:19

标签: c++ c bit-manipulation

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

byte x = 1;
x >> N;

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

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

5 个答案:

答案 0 :(得分:7)

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

  

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

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

  

如果正确,行为是不确定的   操作数是负数,或大于   或等于的位数   提升左操作数。

正在移位的值的存储对此任何一个都没有影响。

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

我觉得你很困惑。 x >> y 实际上并没有真正改变x 。它会计算一个新值。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

它变成全零。无论它的长度是多少都是零。

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