Rust 为什么'128u8.checked_shl(1)'返回'Some(0)`?
我的印象是,整数类型的Rust 为什么'128u8.checked_shl(1)'返回'Some(0)`?,rust,integer-overflow,Rust,Integer Overflow,我的印象是,整数类型的.checked.*(\u)方法有助于避免溢出。但是,.checked_shl(u32)方法很高兴地将上述示例的最后一位移出 我的印象不对吗?那是什么方法 (还想补充一点,为了避免轮班溢出,可以检查((~0)>>rhs)>=self,至少对于无符号类型是如此),因为它只检查轮班数量。从 None如果rhs大于或等于self中的位数 因此,通过设计,它允许您移出位,但不允许您使用无效的移位量(或者,它允许您,但您得到None)。,因为它只检查移位量。从 None如果rhs大于
.checked.*(\u)
方法有助于避免溢出。但是,.checked_shl(u32)
方法很高兴地将上述示例的最后一位移出
我的印象不对吗?那是什么方法
(还想补充一点,为了避免轮班溢出,可以检查
((~0)>>rhs)>=self
,至少对于无符号类型是如此),因为它只检查轮班数量。从
None
如果rhs
大于或等于self
中的位数
因此,通过设计,它允许您移出位,但不允许您使用无效的移位量(或者,它允许您,但您得到
None
)。,因为它只检查移位量。从
None
如果rhs
大于或等于self
中的位数
因此,通过设计,它允许您移出位,它只是不允许您使用无效的移位量(或者,它允许您,但您得到的是
None
)。我的猜测是,它涵盖了C特性,其中移位超过位大小是UB,但左移位被认为更像是位操作,而不是算术操作,所以它不算作算术溢出。但我同意这不一定是唯一明显的选择。我的猜测是,它涵盖了C特性,其中移位大于位大小是UB,但左移位被认为更像是位操作,而不是算术操作,因此它不算作算术溢出。但我同意这不一定是唯一显而易见的选择。