【发布时间】:2018-04-13 23:51:18
【问题描述】:
我对此有点困惑。值不应该在移位后截断吗?
有人知道为什么会这样吗?
long a, b, c, n;
//assign any value to a, set b and c to 0x000...0
n = 128; //any number works;
b = a << n;
c = b >> n;
a == (b >> n); // True
a == c; //True;
后记
我一直都明白,如果您在任何方向移动缓冲区,“落在”缓冲区大小之外的值都会被截断,并且除非您从原始缓冲区中获取它们,否则它们基本上会丢失。 对于我在汇编中使用过的每个平台都是如此,我认为这会扩展到更高级别的语言。
但是,在 c++ 中,我可以将缓冲区(int 或 long)移动比它可以容纳的更多位,如果我然后向相反方向移动,结果等于原始“缓冲区”。
【问题讨论】:
-
可以编译的邮政编码。
-
看看编译器生成的汇编代码——你会在那里找到答案
-
另请注意,移动 signed 类型与移动 unsigned 类型的行为不同,尤其是在右移期间。
-
Idc 关于符号,只有二进制,也可以使用某些值未定义行为,但对于大于 0 的任何其他值,它的行为方式相同。
标签: c++ bitwise-operators bit-shift