iT邦幫忙

2

二、三天學一點點 Rust:來!那些變數們(3)

  • 分享至 

  • xImage
  •  

🦀 Rust 數值型別

1️⃣ 整數型別(Integer Types)

📌 有符號整數(signed, 可以是負數)

型別 位元數 數值範圍 使用情境
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 位 與記憶體、索引有關

📌 無符號整數(unsigned, 只能是正數)

型別 位元數 數值範圍 使用情境
u8 8 0 到 255 位元操作 / 顏色資料
u16 16 0 到 65,535 編碼 / 網路
u32 32 0 到 4,294,967,295 中等資料範圍
u64 64 更大正整數 雲端 / 記錄編號
u128 128 非常大正整數 加密應用
usize 平台決定 0 到記憶體上限 陣列索引、記憶體位址運算

❌ 為什麼 unsigned 較少用在邏輯運算中?

  • u32 - u32 結果不能為負,否則會 panic:
    let a: u32 = 10;
    let b: u32 = 20;
    let c = a - b; // ❌ panic,因為結果是 -10
    

2️⃣ 浮點數型別(Floating-Point Types)

型別 位元數 精度 使用情境
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;

✅ Rust 整數與浮點數型別選擇建議

想法 / 使用情境 建議型別 說明
一般整數運算 i32 Rust 預設整數型別,範圍夠大,直覺易用
浮點數、小數點計算 f64 Rust 預設浮點型別,精度高、通用
陣列索引、切片 .len()、記憶體 usize 專門用於記憶體位址、長度處理
需要非常大的整數(如時間戳記) i64 較大的整數範圍,效能也不錯
數值只會是正整數且範圍很大 u32 / u64 節省符號位,用於特殊資料格式或效能需求
顏色、位元資料處理(RGB / I/O) u8 常見於二進位資料、嵌入式、圖像處理

📝 小提醒:

  • i32f64 是 Rust 中最常見的預設型別,適合一開始就習慣使用
  • 若遇到型別錯誤,可使用 as 強制轉型(例如:let b = a as u32;

✅ Rust 中的整數型別運算規則(重點)

在 Rust 裡,不同型別的整數是不能直接混合運算的,無論你是:

  • u32 和 i32

  • u64 和 i32

  • u8 和 i64

  • usize 和 i32
    👉 都不可以直接相加減、比較或做其他數學運算!

Rust 這樣做是為了 安全性與明確性,避免隱含的資料遺失或錯誤。

那 u64 和 i32 可以直接運算嗎?

不能。你需要先轉型。
舉例:

let a: u64 = 100;
let b: i32 = 50;

// let result = a + b; // ❌ 編譯錯誤,型別不一致

let result = a + b as u64; // ✅ 先將 b 轉型為 u64
println!("結果是 {}", result);

那如果反過來,想把 u64 轉成 i32 呢?

也可以,但要小心「值太大會溢出」。
舉例:

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");}

尚未有邦友留言

立即登入留言