🦀

Rustの整数オーバーフローまとめ

2024/03/07に公開

プロファイル設定

Rustの実行時整数オーバーフローの動作はoverflow-checksの値によって決まります。
trueの場合はオーバーフローが発生したらパニックして、falseの場合は溢れた桁を無視した値を返します。
この設定はdevプロファイルではtrueで、releaseプロファイルではfalseです。

制御方法

計算時にオーバーフローが発生した場合のためのメソッドと型が用意されています。

Checked

checked_*はオーバーフローが発生した場合にNoneを返します。

assert_eq!((u8::MAX - 1).checked_add(1), Some(u8::MAX));
assert!(u8::MAX.checked_add(1).is_none());

Overflowing

overflowing_*は溢れた桁を無視した計算結果とオーバーフローが発生したかの真理値を返します。

assert_eq!((u8::MAX - 1).overflowing_add(1), (u8::MAX, false));
assert_eq!(u8::MAX.overflowing_add(1), (u8::MIN, true));

Saturating

saturating_*はオーバーフローが発生した場合に飽和させた値を返します。

assert_eq!(u8::MIN.saturating_add(1), 1);
assert_eq!(u8::MAX.saturating_add(1), u8::MAX);

Saturatingで値を包むと通常の演算子でも同様の結果になります。

assert_eq!((Saturating(u8::MIN) + Saturating(1)).0, 1);
assert_eq!((Saturating(u8::MAX) + Saturating(1)).0, u8::MAX);

Wrapping

wrapping_*は溢れた桁を無視した計算結果を返します。

assert_eq!((u8::MAX - 1).wrapping_add(1), u8::MAX);
assert_eq!(u8::MAX.wrapping_add(1), u8::MIN);

Wrappingで値を包むと通常の演算子でも同様の結果になります。

assert_eq!((Wrapping(u8::MAX - 1) + Wrapping(1)).0, u8::MAX);
assert_eq!((Wrapping(u8::MAX) + Wrapping(1)).0, u8::MIN);

参考文献

GitHubで編集を提案

Discussion