Rust 的基本类型
Rust 的基本类型
Rust 的基本类型很简单,尤其是对英文不好的人来说,你根本不用去记 tiny,short 等差不多的单词究竟哪个更小,你只需要认识阿拉伯数字就够了。
Rust 的数据类型可以分成两类:基础类型和复合类型。
基础类型
基础类型包含着一眼就能看懂的类型,这些类型是偏底层的,原子的,也就是说你不能再把基础类型细分。
数值类型:
- 有符号整数:i8, i16, i32, i64, i128, isize
- 无符号整数:u8, u16, u32, u64, u128, usize
- 浮点数:f32(单精度), f64(双精度)
- bool 类型:false 和 true
- 字符类型: char,表示单个 Unicode 字符,占用 4 字节
- 字符串切片(后续会讲到为什么叫这个名字): &str
整数类型
哇,好简单的类型啊,我们只需要知道 i 代表有负值,u 代表无负值,就已经掌握了基础了。
i32 代表 有负值的 32 位整数,使用 1 位记录正负,剩余的位记录具体数值,i32 就能表示 ~ 范围的数值,u32 则能表示 0 ~ 的数值,真是言简意赅!
isize 并不是一个固定的值,当代码运行在 32 位系统上时,isize == i32, 当代码运行在 64 位系统时, isize == i64,usize 同理。
size
设计它们的主要理由如下:
-
精确表示内存大小和偏移
内存地址、数组索引、指针偏移天然与平台相关。一个 64 位系统的内存空间远超 32 位,需要用 64 位整数才能安全表示。
对数组进行索引时,Rust 要求使用 usize —— 这保证了索引值不会超出内存可寻址范围。
-
性能优势
CPU 对指针宽度的整数操作通常最快。
使用 usize 进行数组索引或偏移计算,直接对应机器指令,避免隐式类型转换。
-
与 C/C++ FFI 互操作
C 语言中:size_t(无符号)对应 usize,ptrdiff_t(有符号)对应 isize。
Rust 通过直接使用这些类型,可以零成本调用 C 库,无需反复转换。
-
防止平台相关的溢出错误
如果统一用 u32 表示长度,在 64 位系统上可能不够用(例如一个超过 4GB 的文件映射到内存)。
如果统一用 u64,在 32 位系统上会对每个索引都做 64 位运算,降低性能,且浪费寄存器。
isize 和 usize 让代码既能适应大内存平台,又能在小平台上保持高效。
0思考准则
初学者可能会迷惑到底要使用哪个大小,Rust 整形默认会使用 i32,所以不清楚的时候就使用它吧。