数值字面量可以追加类型后缀来标注类型。
举个例子:如果想让字面量 42 的类型为 i32,写成 42i32。
不带后缀的数值字面量,类型取决于它的使用场景。如果编译器无法推断出约束条件,整数默认类型为 i32,浮点数默认类型为 f64。
看例子
fn main() {
// 带后缀字面量:初始化时类型就已经确定
let x = 1u8;
let y = 2u32;
let z = 3f32;
// 无后缀字面量:类型由上下文使用方式决定
let i = 1;
let f = 1.0;
// size_of_val 返回变量占用的字节大小
println!("size of `x` in bytes: {}", std::mem::size_of_val(&x));
println!("size of `y` in bytes: {}", std::mem::size_of_val(&y));
println!("size of `z` in bytes: {}", std::mem::size_of_val(&z));
println!("size of `i` in bytes: {}", std::mem::size_of_val(&i));
println!("size of `f` in bytes: {}", std::mem::size_of_val(&f));
}Code language: Rust (rust)
输出结果
size of `x` in bytes: 1
size of `y` in bytes: 4
size of `z` in bytes: 4
size of `i` in bytes: 4
size of `f` in bytes: 8Code language: JavaScript (javascript)
1. 带后缀数值字面量(Suffixed literals)
语法:数值 + 类型后缀
1u8:无符号 8 位整数(1 字节)2u32:无符号 32 位整数(4 字节)3f32:32 位单精度浮点数(4 字节)
特点:类型固定,编译器无需推断
2. 无后缀数值字面量(Unsuffixed literals)
let i = 1; // 默认 i32(有符号32位整数,4字节)
let f = 1.0; // 默认 f64(64位双精度浮点数,8字节)Code language: Rust (rust)
如果上下文能推导出类型,则覆盖默认类型。
let num: u64 = 100; // 虽然字面量100不带后缀,但是标注类型为u64,最终是u64Code language: Rust (rust)
3. std::mem::size_of_val(&变量)
- 参数:引用
&var(获取变量地址,不转移所有权) - 返回值:该变量在内存占用的字节数量
- 配套函数:
std::mem::size_of::<T>(),获取类型 T 本身大小(不需要变量)
std::mem::size_of_val(&x); // 变量x占用大小
std::mem::size_of::<u8>(); // u8类型占用大小Code language: Rust (rust)
4. 路径、模块、crate 简单理解
std:Rust 标准库 crate(最大内置代码包)std::mem:std 包下的mem内存操作模块std::mem::size_of_val:完整绝对路径调用函数
后续可以用 use 简化路径,不用每次写全路径:
use std::mem::size_of_val;
println!("{}", size_of_val(&x));Code language: Rust (rust)
Previous: 类型转换