如果你有一些变量(在堆栈上)你左或右位移到它的结束会发生什么?
即
byte x = 1;
x >> N;
如果x是一个指向内存转换为字节的指针并且你做了同样的事情该怎么办?
byte* x = obtain pointer from somewhere;
*x = 1;
*x >> N;
答案 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。 没有环绕发生并且它不会移动位置(除非你有点移动指针本身然后我不知道)。