在 Rust 中,整数是基本数据类型之一,用于表示没有小数部分的数字。

整数类型与标注方式

Rust 的整数类型包括有符号整数(以 i 开头)和无符号整数(以 u 开头),位宽可以是 8、16、32、64、128 位,以及平台相关的 isizeusize,比如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;