integer는 소수 부분이 없는 숫자예요.
Cairo에서 정수의 타입 선언은 값을 저장하는 데 프로그래머가 사용할 수 있는 비트 수를 나타내요.
부호 없는 정수는 양수와 숫자 0(영)만 나타낼 수 있어요. 이는 배열 인덱싱과 메모리 관리 같은 특정 프로그래밍 상황에서 유용할 수 있어요.
Cairo는 i 접두사로 시작하는 부호 있는 정수도 지원해요.
이 정수들은 양수와 음수 값을 모두 나타낼 수 있고, 크기는 i8부터 i128까지예요.
각 부호 있는 타입은 해당 타입이 사용하는 비트 수를 $n$이라고 할 때 $-2^{n-1}$ 이상 $2^{n-1} - 1$ 이하의 숫자를 저장할 수 있어요.
예를 들어 i8은 $-2^7$부터 $2^7 - 1$까지의 숫자를 저장할 수 있는데, 이는 $-128$부터 $127$까지와 같아요.
| 길이 | 부호 없음 | 부호 있음 |
|---|---|---|
| 8비트 | u8 | i8 |
| 16비트 | u16 | i16 |
| 32비트 | u32 | i32 |
| 64비트 | u64 | i64 |
| 128비트 | u128 | i128 |
| 256비트 | u256 | ------ |
usize라는 특별한 정수 타입도 있어요. 현재로서는 그냥 u32의 별칭이에요.
이 타입은 나중에 Cairo가 MLIR(다단계 중간 표현)로 컴파일될 수 있게 되면 더 뚜렷한 역할을 하게 될지도 몰라요.
정수 리터럴은 아래 표에 나온 형식 중 어느 것으로든 작성할 수 있어요.
여러 숫자 타입이 될 수 있는 숫자 리터럴은 57_u8처럼 타입 접미사를 붙여 타입을 지정할 수 있어요.
숫자 리터럴에는 코드 가독성을 높이기 위해 시각적 구분자인 _를 사용할 수도 있어요.
| 숫자 리터럴 | 예시 |
|---|---|
| 10진수 | 98222 |
| 16진수 | 0xff |
| 8진수 | 0o04321 |
| 2진수 | 0b01 |
그럼 어떤 정수 타입을 사용해야 할지는 어떻게 알 수 있을까요?
정수가 가질 수 있는 최댓값을 어림잡아 보고 알맞은 크기를 골라 봐요.
usize를 주로 사용하는 상황은 어떤 종류의 컬렉션을 인덱싱할 때예요.
Cairo는 모든 정수 타입에서 기대할 수 있는 기본 수학 연산을 지원해요: 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지.
정수 나눗셈은 0 쪽으로 소수 부분을 버려 가장 가까운 정수로 만들어요.
다음 코드는 let문에서 각 숫자 연산을 어떻게 사용하는지 보여줘요:
fn main() {
// addition
let sum = 5_u128 + 10_u128;
// subtraction
let difference = 95_u128 - 4_u128;
// multiplication
let product = 4_u128 * 30_u128;
// division
let quotient = 56_u128 / 32_u128; // result is 1
let quotient = 64_u128 / 32_u128; // result is 2
// remainder
let remainder = 43_u128 % 5_u128; // result is 3
}
이 문들에서 각 표현식은 수학 연산자를 사용하고 하나의 값으로 평가된 다음 변수에 바인딩돼요.
Cairo가 제공하는 모든 연산자 목록은 The Cairo Book에서 찾을 수 있어요.