NeuroWhAI의 잡블로그

[Rust] wrapping으로 오버플로/언더플로 에러 피하기 본문

개발 및 공부/언어

[Rust] wrapping으로 오버플로/언더플로 에러 피하기

NeuroWhAI 2018. 12. 19. 12:55 ...


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등 유용한 메소드가 많기도 합니다.


끝!



0 Comments
댓글쓰기 폼