2016-06-16 5 views
1

나는 정수 형식의 .checked_*(_) 메서드가 오버플로를 방지하는 데 도움이된다는 인상을 받았습니다. 그러나 .checked_shl(u32) 메서드는 위 예의 마지막 비트를 행복하게 이동합니다.왜`128u8.checked_shl (1)`은`Some (0)`을 리턴합니까?

내 인상이 잘못 되었나요? 그 방법은 이고은 무엇입니까?

+0

내 생각에 비트 크기 이상으로 시프 팅하는 것이 UB이지만, 왼쪽 시프트는 산술 연산보다 비트 조작 연산으로 간주되므로 C 오버 플로우로 계산되지 않습니다. 하지만 반드시 유일한 선택은 아니라는 데 동의합니다. –

답변

5

단지 시프트 량을 확인하기 때문에 (또한 ((~0) >> rhs) >= self 적어도 부호 타입이있는 경우, 하나를 확인할 수는 교대 오버 플로우를 피하기 위해 추가 싶었). rhsself 비트 수보다 크거나 같다

None 경우 docs 가입일.

그래서 디자인을 통해 비트를 이동시킬 수 있습니다. 잘못된 이동량을 사용할 수 없게됩니다 (또는 사용자는 None이됩니다).