型別 | 位元數 | 數值範圍 | 使用情境 |
---|---|---|---|
i8 |
8 | -128 到 127 | 嵌入式、省空間 |
i16 |
16 | -32,768 到 32,767 | 小範圍整數 |
i32 |
32 | -2,147,483,648 到 2,147,483,647 | Rust 預設整數 ✅ |
i64 |
64 | 超大整數 | 大數據 / 時間戳 |
i128 |
128 | 超級大整數 | 加密 / 金融 |
isize |
平台決定 | 32 位或 64 位 | 與記憶體、索引有關 |
型別 | 位元數 | 數值範圍 | 使用情境 |
---|---|---|---|
u8 |
8 | 0 到 255 | 位元操作 / 顏色資料 |
u16 |
16 | 0 到 65,535 | 編碼 / 網路 |
u32 |
32 | 0 到 4,294,967,295 | 中等資料範圍 |
u64 |
64 | 更大正整數 | 雲端 / 記錄編號 |
u128 |
128 | 非常大正整數 | 加密應用 |
usize |
平台決定 | 0 到記憶體上限 | 陣列索引、記憶體位址運算 |
u32 - u32
結果不能為負,否則會 panic:
let a: u32 = 10;
let b: u32 = 20;
let c = a - b; // ❌ panic,因為結果是 -10
型別 | 位元數 | 精度 | 使用情境 |
---|---|---|---|
f32 |
32 | 小數約 6 位 | 適合省空間 |
f64 |
64 | 小數約 15 位 | Rust 預設浮點型別 ✅ |
let weight: f32 = 52.5;
let height = 172.3; // 預設為 f64
fn main() {
let apples: i32 = 50;
let oranges: i32 = 14 + 6;
let fruits = apples + oranges;
println!(
"This year, my garden has {} apples and {} oranges.",
apples, oranges
);
}
其中,let apples = 50; 就是宣告一個變數,不過在Rust裡面,它會變成:let apples: i32 = 50,這是告訴你,i32 表示這個變數的資料型別是 i32(也就是 32 位元的整數)。
println!("This year, my garden has {} apples and {} oranges.", apples, oranges);
這裡用了 字串插值(interpolation with curly braces) 的語法,會把 {} 依序替換成 apples 和 oranges 的值,顯而易見的是,也可以在大刮號中使用{0}代表apples, {1}代表oranges,這樣一來重覆的變數就可以直接代入使用。
另外,let fruits = apples + oranges;你會發現這個函式並沒有使用到fruits這個變數,此時Fruits下方就會出現波浪符號警告,雖然程式一樣可以執行,但會跳出警告說明。解決方法:變數名前面加一個底線即可
let _fruits = apples + oranges;
❗ 注意事項
型別不匹配會編譯錯誤:
let a: u32 = 10;
let b: i32 = 5;
let c = a + b; // ❌ 編譯錯誤!需要轉型
要用 as 強制轉型:
let c = a + b as u32;
想法 / 使用情境 | 建議型別 | 說明 |
---|---|---|
一般整數運算 | i32 ✅ |
Rust 預設整數型別,範圍夠大,直覺易用 |
浮點數、小數點計算 | f64 ✅ |
Rust 預設浮點型別,精度高、通用 |
陣列索引、切片 .len() 、記憶體 |
usize ✅ |
專門用於記憶體位址、長度處理 |
需要非常大的整數(如時間戳記) | i64 ✅ |
較大的整數範圍,效能也不錯 |
數值只會是正整數且範圍很大 | u32 / u64 |
節省符號位,用於特殊資料格式或效能需求 |
顏色、位元資料處理(RGB / I/O) | u8 ✅ |
常見於二進位資料、嵌入式、圖像處理 |
📝 小提醒:
i32
與 f64
是 Rust 中最常見的預設型別,適合一開始就習慣使用as
強制轉型(例如:let b = a as u32;
)在 Rust 裡,不同型別的整數是不能直接混合運算的,無論你是:
u32 和 i32
u64 和 i32
u8 和 i64
usize 和 i32
👉 都不可以直接相加減、比較或做其他數學運算!
Rust 這樣做是為了 安全性與明確性,避免隱含的資料遺失或錯誤。
不能。你需要先轉型。
舉例:
let a: u64 = 100;
let b: i32 = 50;
// let result = a + b; // ❌ 編譯錯誤,型別不一致
let result = a + b as u64; // ✅ 先將 b 轉型為 u64
println!("結果是 {}", result);
也可以,但要小心「值太大會溢出」。
舉例:
let a: u64 = 1_000_000;
// let b: i32 = a; // ❌ 編譯錯誤
let b: i32 = a as i32; // ✅ 強制轉型(但需注意範圍)
⚠️ 注意:
u64 的值若超出 i32 的最大值(約 21 億),轉型會造成 溢位(值錯誤,可能變負數)
建議轉型前可加上檢查,例如:
if a <= i32::MAX as u64 {
let b = a as i32;
println!("安全轉型成功:{}", b);
} else {
println!("值太大,不能轉型成 i32");}