Rust 基本类型:标量与复合类型
更新时间:2026-09-20。Rust 是静态强类型语言:编译器能推断绝大多数类型,但推断不出来时必须显式标注。类型和内存布局的关系可对照本站 内存布局。
一、四类标量
| 类别 | 类型 | 说明 |
|---|---|---|
| 有符号整数 | i8 i16 i32 i64 i128 isize | 默认 i32;isize 宽度随目标平台指针宽度 |
| 无符号整数 | u8 u16 u32 u64 u128 usize | usize 用于索引/长度/集合大小 |
| 浮点 | f32、f64 | 默认 f64;f32/f64 只实现部分比较 trait |
| 布尔 | bool | true/false,占 1 字节 |
| 字符 | char | Unicode 标量值,占 4 字节,不是 1 字节 |
rust
let a: i64 = -5;
let big = 1_000_000; // 下划线分隔,推断为 i32
let hex = 0xff;
let byte = b'A'; // u8 的字节字面量
let ch: char = '中'; // char 是 Unicode,4 字节
let pi = 3.14_f64;二、两类复合类型
rust
// 元组:可放不同类型,定长
let t: (i32, f64, char) = (1, 2.0, 'z');
let (x, y, z) = t; // 解构
let first = t.0; // 下标访问
let unit = (); // 单元类型,无返回值函数的返回类型
// 数组:相同类型、编译期定长,分配在栈上
let arr = [1, 2, 3, 4];
let zeros = [0u8; 8]; // [值; 长度]
let v = arr[0];| 元组 tuple | 数组 array | |
|---|---|---|
| 元素类型 | 可不同 | 必须相同 |
| 长度 | 固定,写进类型 (i32,f64) | 固定,写进类型 [T; N] |
| 变长需求 | — | 用 Vec<T> |
三、类型推断与显式标注
多数场景靠推断即可;以下必须显式:
rust
let v: u64 = "42".parse().expect("not a number"); // parse 目标类型推断不出
let nums: Vec<i32> = Vec::new(); // 空集合无元素可推断
const LIMIT: usize = 100; // const 必须标类型
fn add(a: i32, b: i32) -> i32 { a + b } // 函数签名必须全标四、整数溢出:debug 与 release 不同
rust
let mut n: u8 = 255;
// n += 1;- debug 构建:溢出直接
panic!(便于开发期抓 bug)。 - release 构建:默认按补码回绕成 0,不报错——这是隐蔽 bug 来源。
明确想要某种语义用专用方法:wrapping_add(回绕)、checked_add(返回 None)、saturating_add(饱和到上限)。
五、常见坑
- 混用有符号/无符号:
i32与usize不做隐式转换,索引与长度运算统一用usize,跨类型用try_into()/as显式转。 as静默截断:1000u32 as u8得232,只在确定安全时用;不可信转换用u32::try_from(x)。- 数组当 Vec:数组长度是类型的一部分,
[u8;3]和[u8;4]是不同类型,变长数据用Vec,视图用切片。 - 以为 char 是字节:处理 UTF-8 字节流要用
u8/&str的字节方法,按「字符」遍历用.chars()。
总结
Rust 标量分整数(i/u,索引长度用 isize/usize)、浮点 f32/f64、bool 与四字节 Unicode 的 char;复合类型只有定长、可异构的元组和定长、同构、栈上分配的数组,变长要改用 Vec;类型靠推断但空集合、parse 目标、const、函数签名必须显式标注;整数溢出在 debug 下 panic、release 下静默回绕,要确定语义时用 wrapping/checked/saturating 系列,并警惕 as 截断和有符号无符号不隐式转换。**