在 Rust 中,整数是基本数据类型之一,用于表示没有小数部分的数字。
整数类型与标注方式
Rust 的整数类型包括有符号整数(以 i 开头)和无符号整数(以 u 开头),位宽可以是
8、16、32、64、128 位,以及平台相关的 isize 和
usize,比如i32表示 32 位有符号整数。类型标注可以通过显式声明或使用后缀来实现。
let a: i32 = 42; // 显式类型标注
let b = 42u8; // 使用后缀标注为 u8
let c = 42; // 类型推断为 i32(默认)
可以使用下划线_提高可读性,不影响数值大小:
let million = 1_000_000; // 等同于 1000000
let billion = 1_000_000_000; // 等同于 1000000000
let val = 1_2345_678; // 等同于 12345678
有符号与无符号的区别
有符号整数可以表示正数、负数和零,而无符号整数只能表示非负数(包括零)。例如,i8 的范围是 -128 到 127,而
u8 的范围是 0 到 255。
let signed: i8 = -50; // 有效
let unsigned: u8 = 200; // 有效
// let invalid: u8 = -10; // 编译错误:不能将负数赋给无符号类型
数值范围
无符号整数最小值为0,最大值为2^n - 1;
有符号整数最小值为-2^(n-1),最大值为2^(n-1) - 1;
其中n是位数;
可以使用标准库的MAX和MIN常量获取类型的最小值和最大值:
fn main() {
// 使用 MIN 和 MAX 关联常量
println!("i8: {} 到 {}", i8::MIN, i8::MAX);
println!("u8: {} 到 {}", u8::MIN, u8::MAX);
println!("i16: {} 到 {}", i16::MIN, i16::MAX);
println!("u16: {} 到 {}", u16::MIN, u16::MAX);
println!("i32: {} 到 {}", i32::MIN, i32::MAX);
println!("u32: {} 到 {}", u32::MIN, u32::MAX);
println!("i64: {} 到 {}", i64::MIN, i64::MAX);
println!("u64: {} 到 {}", u64::MIN, u64::MAX);
println!("i128: {} 到 {}", i128::MIN, i128::MAX);
println!("u128: {} 到 {}", u128::MIN, u128::MAX);
println!("isize: {} 到 {}", isize::MIN, isize::MAX);
println!("usize: {} 到 {}", usize::MIN, usize::MAX);
}
基本数值计算方法
Rust 支持基本的算术运算,如加法、减法、乘法和除法。整数除法会向下取整,丢弃余数。
let sum = 10 + 5; // 15
let diff = 10 - 5; // 5
let product = 10 * 5; // 50
let quotient = 10 / 3; // 3(整数除法)
let remainder = 10 % 3; // 1(取余)
类型转换与截断
Rust 要求显式类型转换,使用 as 关键字:
// 向上转换(无损失)
let a: u8 = 42;
let b: u32 = a as u32; // 42 -> 42
let c: u64 = a as u64; // 42 -> 42
let d: i128 = a as i128; // 42 -> 42
// 向下转换(可能截断)
let large: u32 = 1000;
let small: u8 = large as u8;
println!("{} -> {}", large, small); // 1000 -> 232
数值截断是指在数值类型转换或运算中,丢弃超出目标类型范围的位,只保留低位的部分。
fn main() {
let x: u16 = 300; // 16位无符号
let y: u8 = x as u8; // 转换为8位无符号
// 300的16位二进制表示
//高位--------低位
//0000000100101100
//转换成8位无符号后,只保留低8位
//00101100 //44的二进制
println!("{}",y); // 44
}
其它进制表示
Rust 允许使用不同进制字面量来表示整数,如二进制、八进制和十六进制。
let decimal = 42; // 十进制(默认,无前缀)
let binary = 0b101010; // 二进制(0b 前缀)
let octal = 0o52; // 八进制(0o 前缀,字母o)
let hex = 0x2A; // 十六进制(0x 前缀)
// 所有进制都支持下划线分隔
let with_underscore = 0b1010_1010;