我试图找到有关<<
和>>
运算符如何处理整数的确切信息,但是我找不到明确的答案(the documentation在这方面不是那么好)。
我不清楚语义的两个部分。首先,“移入”了哪些位?
0b1110_1010u8 << 4 == 0b1010_0000u8
)移入,或0b1110_1010u8 << 4 == 0b1010_1110u8
),或此外,移位如何处理带符号整数?符号位是否也参与移位?还是未指定?
答案 0 :(得分:8)
关于特征Shl
和Shr
的精简文档是有意为之的,因此它们可以采用最适合手头类型的行为(请考虑使用新类型!)。
话虽这么说,当涉及到基本整数类型时,Rust reference通过一些推断来介绍它们的行为:
<<
|左移|std::ops::Shl
>>
|右移* |std::ops::Shr
*有符号整数类型的算术右移,无符号整数类型的逻辑右移。
它还包含一些示例,这些示例进一步阐明了这些是常规的逻辑/算术移位:将零插入左位移位的最低有效位,并将最高有效位扩展为右位的有符号整数转移。如方法rotate_left
和rotate_right
所述,它也是not a rotation。
assert_eq!(13 << 3, 104);
assert_eq!(-10 >> 2, -3);
此外,移位太多位可能被视为算术溢出,并且不是不确定的行为。参见:Is it expected that a too large bitshift is undefined behavior in Rust?
答案 1 :(得分:8)
Rust的shift运算符的确切语义是什么?
没有。移位运算符是用户可实现的特征,您基本上可以在其中执行任何所需的操作。该文档甚至显示了“ Shr
的[a] n实现,该实现将向量向右旋转给定的数量。”
<<
和>>
运算符如何处理整数,
参考文献中有Arithmetic and Logical Binary Operators部分。最有用的是,它包含以下脚注:
有符号整数类型的算术右移,无符号整数类型的逻辑右移。
Logical shifting和arithmetic shifting是已建立定义的计算机科学术语。
零移了
是的
位旋转