Rust에서 **정수 오버플로(overflow)**를 안전하게 다루기 위한 메소드들은 다음과 같이 네 가지 주요 종류로 나뉩니다. 이 메소드들은 모두 정수 타입(i32, u32, i64, 등)에 대해 사용할 수 있으며, 오버플로가 발생할 때 어떻게 처리할지를 결정합니다.
wrapping_*let a: u8 = 255;
let b = a.wrapping_add(1); // b == 0
| 메소드 | 설명 |
|---|---|
.wrapping_add() | 오버플로 시 0부터 다시 시작 |
.wrapping_sub() | 언더플로 시 최대값으로 돌아감 |
.wrapping_mul() | 곱셈 후 오버플로 허용 |
checked_*None을 반환 (Option 타입)let a: u8 = 255;
let b = a.checked_add(1); // b == None
| 메소드 | 설명 |
|---|---|
.checked_add() | 오버플로 시 None 반환 |
.checked_sub() | 언더플로 시 None 반환 |
.checked_mul() | 곱셈 오버플로 시 None 반환 |
주로 안전한 수 계산이 필요한 곳에 사용
overflowing_*let a: u8 = 255;
let (result, overflowed) = a.overflowing_add(1); // (0, true)
| 메소드 | 설명 |
|---|---|
.overflowing_add() | 오버플로 발생 여부와 결과를 함께 반환 |
.overflowing_sub() | 언더플로 포함 여부도 함께 반환 |
.overflowing_mul() | 곱셈 오버플로 여부도 함께 반환 |
값과 오버플로 플래그가 필요한 저수준 계산에 유용
saturating_*let a: u8 = 255;
let b = a.saturating_add(1); // b == 255
| 메소드 | 설명 |
|---|---|
.saturating_add() | 오버플로 시 최대값 반환 |
.saturating_sub() | 언더플로 시 최소값 반환 |
.saturating_mul() | 곱셈 오버플로 시 최대값 |
주로 그래픽, 하드웨어 프로그래밍 등에서 안전한 범위 보존을 위해 사용
| 메소드 종류 | 반환 값 | 오버플로 시 동작 |
|---|---|---|
wrapping_* | 값 | 값이 순환 (wrap-around) |
checked_* | Option | None 반환 |
overflowing_* | (값, bool) | 결과와 오버플로 여부 반환 |
saturating_* | 값 | 최대값 또는 최소값으로 포화 처리 |
fn main() {
let x: u8 = 250;
println!("wrapping: {}", x.wrapping_add(10)); // 4
println!("checked: {:?}", x.checked_add(10)); // None
println!("overflowing: {:?}", x.overflowing_add(10)); // (4, true)
println!("saturating: {}", x.saturating_add(10)); // 255
}
필요하시면 각 방식의 성능, 실제 적용 예제, 비교 벤치마크도 제공해 드릴 수 있습니다.