797 단어
4 분
정수형 타입

타입 종류#

i8 i16 i32 i64 i128 isize / u8 u16 u32 u64 u128 usize

타입 보는 법#

여기서 iinteger(일반 정수)를 의미하고, uunsigned integer(부호 없는 정수)를 의미합니다.

뒤에 있는 숫자는 변수가 저장하는 bit 크기를 의미합니다.

예를 들어, i8은 부호가 있는 8비트 정수라고 생각하시면 됩니다.

isizeusize시스템 아키텍처 에 따라 32비트 또는 64비트로 결정되는 정수 타입입니다.
포인터 크기와 같기 때문에, 주로 컬렉션 인덱스나 메모리 크기 등을 다룰 때 쓰입니다.

최대/최소 크기#

i 타입은 부호를 저장하는 데 1비트를 사용하기 때문에, -2^(n-1) ~ 2^(n-1)-1의 범위를 가집니다.

u 타입은 부호가 없기 때문에 0 ~ 2^n-1 범위로 계산됩니다.

i8 = -128 ~ 127 (2^7 범위, 부호 있음)
u8 = 0 ~ 255 (2^8 범위, 부호 없음)
NOTE

이런 계산이 귀찮다면 i32::MIN, i32::MAX 같은 상수를 사용하는 게 편리합니다.

숫자 구분자 사용하기#

정수에 _를 사용하면 10_000처럼 숫자를 보기 좋게 구분할 수 있습니다.

정수에 타입 명시#

let x = 10처럼 쓰면 Rust는 숫자의 타입을 자동으로 추론합니다.
하지만 타입을 명확히 지정해야 하는 상황이라면 10i32처럼 숫자 뒤에 타입을 붙여서 쓸 수 있습니다.

NOTE

숫자와 타입이 붙어 있어서 읽기 어렵다면, 중간에 _를 넣어 10_i32처럼 구분할 수 있습니다.

Rust는 _를 무시하기 때문에 10____________i32처럼 여러 개 넣어도 동작하지만, 가독성을 해치니 추천하지는 않습니다.

많이 쓰는 메서드#

정수 연산을 할 때 자주 사용하는 메서드들입니다.

IMPORTANT

assert_eq!(a, b)는 a와 b의 값이 같은지 비교하고, 다르면 오류가 발생합니다.
아래 예제에서는 a를 실행했을 때 결과가 b가 되는구나~ 라고 이해하시면 됩니다.

pow#

수를 원하는 수로 제곱합니다.

main.rs
assert_eq!(10_i32.pow(3), 1_000);
assert_eq!(i32::pow(10, 4), 10_000);

min#

값 중 작은 것을 반환합니다.

main.rs
assert_eq!(10.min(5), 5);
assert_eq!(5.min(10), 5);

max#

값 중 큰 것을 반환합니다.

main.rs
assert_eq!(10.max(5), 10);
assert_eq!(5.max(10), 10);

is_positive#

값이 양수인지 확인합니다.

main.rs
assert_eq!(10_i8.is_positive(), true);
assert_eq!((-10_i8).is_positive(), false);

is_negative#

값이 음수인지 확인합니다.

main.rs
assert_eq!(10_i8.is_negative(), false);
assert_eq!((-10_i8).is_negative(), true);

wrapping_*#

오버플로우 시 비트 래핑1 처리를 합니다.

main.rs
assert_eq!(i8::MAX.wrapping_add(10), i8::MIN + 9);
assert_eq!(i8::MIN.wrapping_sub(10), i8::MAX - 9);

overflowing_*#

오버플로우 시 비트 래핑1 처리를 한 이후, 오버플로우가 발생했는지를 함께 반환합니다.

main.rs
assert_eq!(i8::MAX.overflowing_add(10), (i8::MIN + 9, true));
assert_eq!(i8::MIN.overflowing_sub(10), (i8::MAX - 9, true));
assert_eq!(10_i8.overflowing_add(10), (20, false));
assert_eq!(10_i8.overflowing_sub(10), (0, false));

checked_*#

오버플로우 시 None을 반환합니다.

main.rs
assert_eq!(i8::MAX.checked_add(10), None);
assert_eq!(i8::MIN.checked_sub(10), None);
assert_eq!(10_i8.checked_add(10), Some(20));
assert_eq!(10_i8.checked_sub(10), Some(0));

saturating_*#

정수의 최대/최소값을 넘지 않도록 처리합니다.

main.rs
assert_eq!(i8::MAX.saturating_add(10), i8::MAX);
assert_eq!(i8::MIN.saturating_sub(10), i8::MIN);

Footnotes#

  1. 최대/최소 범위를 넘었을 때 반대쪽으로 넘어가는 동작을 비트 래핑(bit wrapping) 이라고 합니다. 2