
타입 종류
i8
i16
i32
i64
i128
isize
/ u8
u16
u32
u64
u128
usize
타입 보는 법
여기서 i
는 integer(일반 정수)를 의미하고, u
는 unsigned integer(부호 없는 정수)를 의미합니다.
뒤에 있는 숫자는 변수가 저장하는 bit 크기를 의미합니다.
예를 들어, i8
은 부호가 있는 8비트 정수라고 생각하시면 됩니다.
isize
나 usize
는 시스템 아키텍처 에 따라 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
수를 원하는 수로 제곱합니다.
assert_eq!(10_i32.pow(3), 1_000);assert_eq!(i32::pow(10, 4), 10_000);
min
값 중 작은 것을 반환합니다.
assert_eq!(10.min(5), 5);assert_eq!(5.min(10), 5);
max
값 중 큰 것을 반환합니다.
assert_eq!(10.max(5), 10);assert_eq!(5.max(10), 10);
is_positive
값이 양수인지 확인합니다.
assert_eq!(10_i8.is_positive(), true);assert_eq!((-10_i8).is_positive(), false);
is_negative
값이 음수인지 확인합니다.
assert_eq!(10_i8.is_negative(), false);assert_eq!((-10_i8).is_negative(), true);
wrapping_*
오버플로우 시 비트 래핑1 처리를 합니다.
assert_eq!(i8::MAX.wrapping_add(10), i8::MIN + 9);assert_eq!(i8::MIN.wrapping_sub(10), i8::MAX - 9);
overflowing_*
오버플로우 시 비트 래핑1 처리를 한 이후, 오버플로우가 발생했는지를 함께 반환합니다.
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
을 반환합니다.
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_*
정수의 최대/최소값을 넘지 않도록 처리합니다.
assert_eq!(i8::MAX.saturating_add(10), i8::MAX);assert_eq!(i8::MIN.saturating_sub(10), i8::MIN);