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

时间:2018-07-28 11:46:07

标签: rust bit-shift

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

我不清楚语义的两个部分。首先,“移入”了哪些位?

  • 零从一侧(即0b1110_1010u8 << 4 == 0b1010_0000u8)移入,或
  • 位旋转(即0b1110_1010u8 << 4 == 0b1010_1110u8),或
  • 未指定(例如未指定整数的溢出行为),或
  • 其他。

此外,移位如何处理带符号整数?符号位是否也参与移位?还是未指定?

2 个答案:

答案 0 :(得分:8)

关于特征ShlShr的精简文档是有意为之的,因此它们可以采用最适合手头类型的行为(请考虑使用新类型!)。

话虽这么说,当涉及到基本整数类型时,Rust reference通过一些推断来介绍它们的行为:

  
      
  • << |左移| std::ops::Shl

  •   
  • >> |右移* | std::ops::Shr

  •   
     

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

它还包含一些示例,这些示例进一步阐明了这些是常规的逻辑/算术移位:将零插入左位移位的最低有效位,并将最高有效位扩展为右位的有符号整数转移。如方法rotate_leftrotate_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 shiftingarithmetic shifting是已建立定义的计算机科学术语。

  

零移了

是的

  

位旋转

不。旋转leftright有单独的方法。