Notice
Recent Posts
Recent Comments
NeuroWhAI의 잡블로그
[Rust] wrapping으로 오버플로/언더플로 에러 피하기 본문
fn main() {
let num = u32::max_value();
println!("{}", num + 1);
}
러스트는 런타임 연산 과정에서 오버/언더플로를 감지하여 패닉을 일으켜주는 기능이 있습니다.
그래서 위 코드는 "thread 'main' panicked at 'attempt to add with overflow'"같은 에러를 뿜습니다.
대부분은 도움이 되지만 가끔 일부러 오버/언더플로를 일으키는 경우도 있습니다.
그럴 때 쓸 수 있는게 wrapping_* 메소드나 Wrapping입니다.
fn main() {
let num = u32::max_value();
println!("{}", num.wrapping_add(1));
}
위 코드는 wrapping_add 메소드를 사용해서 패닉 없이 오버플로를 수행하는 예제입니다.
이게 가장 편하긴 한데 만약 이런 위험한 연산을 여러 곳에서 수행해야 하는 필드라면 아래 방법도 좋습니다.
use std::num::Wrapping;
fn main() {
let num = Wrapping(u32::max_value());
println!("{}", (num + Wrapping(1)).0);
}
미리 Wrapping 튜플을 통해 감싼 후 연산시 오버/언더플로가 발생하지 않습니다.
현재는 nightly 버전에만 있지만 Wrapping에는 count_zeros등 유용한 메소드가 많기도 합니다.
끝!
'개발 및 공부 > 언어' 카테고리의 다른 글
[Rust] turbofish - 제너릭 타입 지정 문법 (0) | 2019.01.10 |
---|---|
[Rust] macro_use 불필요! (0) | 2018.12.28 |
[Rust] enum 사용시 주의 사항 (0) | 2018.12.06 |
[Rust] Lifetime의 한계 (0) | 2018.11.18 |
[C++] Designated initializers (0) | 2018.11.17 |
Comments