Rust的移位运算符的确切语义是什么?

Luk*_*odt 14 bit-shift rust

我试图找到有关<<>>运算符如何处理整数的确切信息,但我找不到一个明确的答案(文档在这方面并不是那么好).

语义的两个部分对我来说并不清楚.首先,哪些位"移入"?

  • 零从一侧(即0b1110_1010u8 << 4 == 0b1010_0000u8)移入,或
  • 比特旋转(即0b1110_1010u8 << 4 == 0b1010_1110u8),或
  • 它是未指定的(如整数的溢出行为未指定),或
  • 别的.

此外,移位如何使用有符号整数?符号位是否也参与了班次?或者这是未指定的?

She*_*ter 10

Rust的移位运算符的确切语义是什么?

没有了.移位运算符是用户可实现的特性,您可以基本上执行任何您想要的操作.该文档甚至显示了一个"[a] n实现的示例,Shr该向量将向量旋转给定量的向右".


<<>>运算符如何处理整数,

该参考文献有一节关于算术和逻辑二元运算符.最有用的是,它包含了这个脚注:

有符号整数类型的算术右移,无符号整数类型的逻辑右移.

逻辑移位算术移位是预先存在的计算机科学术语和已建立的定义.

零转移

是.

这些位旋转

号有旋转不同的方法.


E_n*_*ate 9

在性状薄文件ShlShr是故意的,让他们可以采取的行为是最适合于手头的类型(认为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中,是否预期过大的位移是未定义的行为?