我试图找到有关<<
和>>
运算符如何处理整数的确切信息,但我找不到一个明确的答案(文档在这方面并不是那么好).
语义的两个部分对我来说并不清楚.首先,哪些位"移入"?
0b1110_1010u8 << 4 == 0b1010_0000u8
)移入,或0b1110_1010u8 << 4 == 0b1010_1110u8
),或此外,移位如何使用有符号整数?符号位是否也参与了班次?或者这是未指定的?
在性状薄文件Shl
和Shr
是故意的,让他们可以采取的行为是最适合于手头的类型(认为newtypes!).
话虽如此,当谈到基本整数类型时,Rust引用涵盖了它们的行为方式,并进行了一些推断:
<<
| 左转|std::ops::Shl
>>
| 右移*|std::ops::Shr
*有符号整数类型的算术右移,无符号整数类型的逻辑右移.
它还包括一些例子,它们进一步阐明了这些是传统的逻辑/算术移位:在左移位时将零插入最低有效位,在右移位上为有符号整数扩展最高有效位.它也不是旋转,如方法rotate_left
和中所述rotate_right
.
assert_eq!(13 << 3, 104);
assert_eq!(-10 >> 2, -3);
Run Code Online (Sandbox Code Playgroud)
此外,移位太多位可以被视为算术溢出,并且不是未定义的行为.请参阅:在Rust中,是否预期过大的位移是未定义的行为?