🦀
Rustの整数オーバーフローまとめ
プロファイル設定
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);
Discussion