iT邦幫忙

1

二、三天學一點點 Rust:來!整數、usize、isize、跳脫字元、原始字串(7)

  • 分享至 

  • xImage
  •  

📚 資料型別(Data Types)

✅ 每個 Rust 值都有資料型別

Rust 是一種靜態型別語言(statically typed language),這表示:

  • 在編譯時,編譯器必須知道所有變數的型別。
  • 不過,Rust 編譯器通常能透過變數的初始賦值來推斷型別。

🔢 標量型別(Scalar Types)

標量型別是指儲存單一數值的型別。Rust 中有四種標量型別:
1.整數(Integers):儲存整數值。

  • 有號整數(如 i32):可儲存正數與負數,以i開頭。
  • 無號整數(如 u32):只儲存0 和正數,所以在相同位元數下能儲存更大的正數,型別名稱以u開頭。
    2.浮點數(Floating-point numbers):儲存帶有小數點的數值。
    3.布林值(Booleans):代表 true 或 false。
    4.字元(Characters):例如 'a'、'中' 等 Unicode 字元。

🧠 位元(Bits)

整數型別後面的數字(如 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)

由於前述變數單元,已經講了基本原則,此處就會上程式碼簡單說明,或者放一些自己遇到的特殊狀況。

整數(Integers):

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 是什麼?

usizeisize 是 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

usizeisize 的大小會根據你程式運行的電腦架構自動調整。


🧪 常見用途與程式範例

📌 使用 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() 之類的函式,等課程有上到再補充好了,我發現這後面再研究一下,又是一長串的文章。

📚 Rust 中常見的字串跳脫符號與原始字串(Raw String)

✅ 什麼是跳脫字元(escape characters)?

當我們要在字串中輸入特殊符號(如換行、雙引號、Tab 等),需要用 \ 開頭的跳脫字元來避免語法錯誤。

✅ 什麼是原始字串(Raw String)?

當你使用 r"..." 或 r#"..."# 時,裡面的內容會原封不動保留,不會解析跳脫符號。常用於路徑、正則表達式等。

🧵 Rust 常見跳脫字元與原始字串整理表

類型 語法範例 說明
換行 "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...

🧠 小技巧:多層 # 的 raw string

println!(r#"This is "quoted" text"#); // OK
println!(r##"He said "#Hello!""##);    // 當內部出現 `"#` 時,用多個 `#` 包圍即可
println!("I'm so beautiful."); //單引號是可以的,不需跳脫字元與原始字串

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言