Rust 是一種靜態型別語言(statically typed language),這表示:
標量型別是指儲存單一數值的型別。Rust 中有四種標量型別:
1.整數(Integers):儲存整數值。
整數型別後面的數字(如 i32 的 32)代表它使用的位元數。
1 位元(bit):最小的記憶單位,只能表示 0 或 1。
8 bit = 1 byte
1024 bytes = 1 KB
1024 KB = 1 MB
1024 MB = 1 GB
範例:
i32 使用 32 位元(4 byte)
f64 使用 64 位元(8 byte)
fn main() {
let sixteen_bit_unsigned: u16 = 32765;
let sixteen_bit_unsigned: u32 = -32765;
}
關於之前提到當你使用16、32位元儲存整數,是有一定的範圍的,如案例中,u32範圍是0~ 4,294,967,295,因此輸入-32765就會出現以下的錯誤。
error[E0600]: cannot apply unary operator `-` to type `u32`
--> src\main.rs:3:35
|
3 | let sixteen_bit_signed: u32 = -32765;
| ^^^^^^ cannot apply unary operator `-`
|
= note: unsigned values cannot be negated
錯誤如上,其它以此類推。
let number: i32 = 320;
這邊有個特別小細節,一般來說,假設我現在使用64位元儲存整數,如果要改成小一點的單位,可以使用兩種方法。
✅ 方法一:改變變數型別,滑鼠直接點i64兩下後修改。
let number: i16 = 320;
✅ 方法二:在寫的過程中,直接在數字後方加入你要的位元,例如原本預設32位元改16位元
let number = 320i16;
✅ Rust 中數值的分隔方式
let big_number = 1_000_000; // 百萬
let credit_card = 1234_5678_9012_3456u64; // 信用卡號
let binary = 0b1010_1100_0011_0001; // 二進位分組更清楚
let number = 32,500; // ❌ 錯誤,會被視為語法錯誤(逗號是分隔運算)
有時候數字太大,無法像平常使用逗號,則可以使用下底線的方式來讓數值更容易閱讀。
usize
/ isize
是什麼?usize
和 isize
是 Rust 中專門用來表示記憶體相關的數值型別。
型別 | 說明 | 有號/無號 | 常見用途 |
---|---|---|---|
usize |
unsigned size(無號) | 無號 | 陣列索引、長度 |
isize |
signed size(有號) | 有號 | 記憶體位址偏移運算 |
系統架構 | usize / isize 大小 |
等同於 |
---|---|---|
32-bit | 4 bytes(32 bits) | u32 / i32 |
64-bit | 8 bytes(64 bits) | u64 / i64 |
usize
和 isize
的大小會根據你程式運行的電腦架構自動調整。
usize
作為陣列索引let arr = [10, 20, 30];
let index: usize = 1;
println!("{}", arr[index]); // 印出 20
Rust 的索引預設用 usize,因為這樣才不會超出你系統能處理的最大記憶體範圍。
isize
做指標位移let arr = [10, 20, 30];
let ptr = arr.as_ptr();
unsafe {
let value = *ptr.offset(-1); // offset 是 isize,允許正負偏移
// ⚠️ 這只是示範,實際會導致錯誤存取!
}
offset(n) 接受的是 isize,可以正負偏移記憶體位置,常見於低階操作。
let size = std::mem::size_of::<T>(); // 回傳 usize 型別
而上述關於offset、as_ptr() 之類的函式,等課程有上到再補充好了,我發現這後面再研究一下,又是一長串的文章。
當我們要在字串中輸入特殊符號(如換行、雙引號、Tab 等),需要用 \ 開頭的跳脫字元來避免語法錯誤。
當你使用 r"..." 或 r#"..."# 時,裡面的內容會原封不動保留,不會解析跳脫符號。常用於路徑、正則表達式等。
類型 | 語法範例 | 說明 |
---|---|---|
換行 | "Hello\nWorld" |
\n 表示換行 |
Tab 縮排 | "Hello\tWorld" |
\t 表示跳格(Tab) |
雙引號 | "She said \"Hi\"" |
\" 表示字串內的雙引號 |
單引號 | "Rust is a \'system\' language" |
\' 表示字串內的單引號 |
反斜線 | "C:\\Users\\Name" |
\\ 表示反斜線 \ 本身 |
原始字串 | r"C:\Users\Name" |
不需要跳脫的字串,r"" 保留內容 |
多層原始字串 | r#"He said, "I'm fine.""# |
原始字串支援內部雙引號 |
多行原始字串 | r#"<html>\n<body>\n</body>\n</html>"# |
可保留原樣格式 |
Unicode 字元 | "\u{2764}" |
輸出 ❤️(愛心) |
println!("Dear Lei, \nAre you ok?");
// \n → 換行
println!("\tOnce upon a time");
// \t → Tab 縮排
println!("Lei Said \"I am so beautiful.\"");
// \" → 顯示引號
println!(r"C:\Users\iamad\Desktop\Rust\variables-and-mutability2");
// r"..." → 原始字串,不需寫成 C:\\Users...
println!(r#"This is "quoted" text"#); // OK
println!(r##"He said "#Hello!""##); // 當內部出現 `"#` 時,用多個 `#` 包圍即可
println!("I'm so beautiful."); //單引號是可以的,不需跳脫字元與原始字串