타입 종류
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);