基本数据类型 #

一、类型系统概述 #

Rust是静态类型语言,所有变量的类型在编译时必须确定。Rust的类型系统分为两大类:

  • 标量类型:整数、浮点、布尔、字符
  • 复合类型:元组、数组、结构体、枚举

二、整数类型 #

2.1 整数类型列表 #

类型 大小 范围
i8 8位 -128 ~ 127
u8 8位 0 ~ 255
i16 16位 -32768 ~ 32767
u16 16位 0 ~ 65535
i32 32位 -2^31 ~ 2^31-1
u32 32位 0 ~ 2^32-1
i64 64位 -2^63 ~ 2^63-1
u64 64位 0 ~ 2^64-1
i128 128位 -2^127 ~ 2^127-1
u128 128位 0 ~ 2^128-1
isize 指针大小 取决于架构
usize 指针大小 取决于架构

2.2 整数字面量 #

rust
fn main() {
    // 十进制
    let decimal = 98_222;
    
    // 十六进制
    let hex = 0xff;
    
    // 八进制
    let octal = 0o77;
    
    // 二进制
    let binary = 0b1111_0000;
    
    // 字节(仅u8)
    let byte = b'A';
    
    println!("decimal: {}", decimal);
    println!("hex: {}", hex);
    println!("octal: {}", octal);
    println!("binary: {}", binary);
    println!("byte: {}", byte);
}

2.3 类型推断 #

rust
fn main() {
    let x = 42;        // 默认推断为 i32
    let y: u64 = 100;  // 显式指定 u64
    
    println!("x: {}, y: {}", x, y);
}

2.4 整数溢出 #

在debug模式下,整数溢出会导致panic:

rust
fn main() {
    let mut x: u8 = 255;
    // x += 1;  // debug模式下panic
    
    // 使用 wrapping_* 方法允许溢出
    let a: u8 = 255;
    let b = a.wrapping_add(1);
    println!("wrapping: {}", b);  // 0
    
    // 使用 checked_* 方法检查溢出
    let c: u8 = 255;
    match c.checked_add(1) {
        Some(v) => println!("result: {}", v),
        None => println!("overflow!"),
    }
    
    // 使用 saturating_* 方法饱和运算
    let d: u8 = 255;
    let e = d.saturating_add(1);
    println!("saturating: {}", e);  // 255
    
    // 使用 overflowing_* 方法返回溢出标志
    let f: u8 = 255;
    let (g, overflowed) = f.overflowing_add(1);
    println!("result: {}, overflowed: {}", g, overflowed);
}

2.5 整数运算 #

rust
fn main() {
    let a: i32 = 10;
    let b: i32 = 3;
    
    println!("加法: {} + {} = {}", a, b, a + b);
    println!("减法: {} - {} = {}", a, b, a - b);
    println!("乘法: {} * {} = {}", a, b, a * b);
    println!("除法: {} / {} = {}", a, b, a / b);
    println!("取余: {} % {} = {}", a, b, a % b);
}

三、浮点类型 #

3.1 浮点类型 #

Rust有两种浮点类型:

类型 大小 精度
f32 32位 单精度(约6-7位有效数字)
f64 64位 双精度(约15-17位有效数字)
rust
fn main() {
    let x = 2.0;      // 默认 f64
    let y: f32 = 3.0; // f32
    
    println!("x: {}, y: {}", x, y);
}

3.2 浮点运算 #

rust
fn main() {
    let x = 2.5;
    let y = 3.0;
    
    println!("加法: {} + {} = {}", x, y, x + y);
    println!("减法: {} - {} = {}", x, y, x - y);
    println!("乘法: {} * {} = {}", x, y, x * y);
    println!("除法: {} / {} = {}", x, y, x / y);
    println!("取余: {} % {} = {}", x, y, x % y);
}

3.3 特殊值 #

rust
fn main() {
    // 无穷大
    let inf = f64::INFINITY;
    let neg_inf = f64::NEG_INFINITY;
    
    // 非数字
    let nan = f64::NAN;
    
    println!("Infinity: {}", inf);
    println!("Negative Infinity: {}", neg_inf);
    println!("NaN: {}", nan);
    
    // 检查方法
    println!("is_nan: {}", nan.is_nan());
    println!("is_infinite: {}", inf.is_infinite());
    println!("is_finite: {}", 1.0_f64.is_finite());
}

3.4 数学函数 #

rust
fn main() {
    let x = 2.0_f64;
    
    println!("sqrt: {}", x.sqrt());
    println!("abs: {}", (-x).abs());
    println!("pow: {}", x.powi(3));
    println!("floor: {}", 2.7_f64.floor());
    println!("ceil: {}", 2.3_f64.ceil());
    println!("round: {}", 2.5_f64.round());
    println!("sin: {}", std::f64::consts::PI.sin());
    println!("cos: {}", std::f64::consts::PI.cos());
}

四、布尔类型 #

4.1 布尔值 #

rust
fn main() {
    let t = true;
    let f: bool = false;
    
    println!("true: {}", t);
    println!("false: {}", f);
}

4.2 布尔运算 #

rust
fn main() {
    let a = true;
    let b = false;
    
    println!("a && b: {}", a && b);  // 逻辑与
    println!("a || b: {}", a || b);  // 逻辑或
    println!("!a: {}", !a);          // 逻辑非
}

4.3 比较运算 #

rust
fn main() {
    let x = 5;
    let y = 10;
    
    println!("x == y: {}", x == y);
    println!("x != y: {}", x != y);
    println!("x < y: {}", x < y);
    println!("x > y: {}", x > y);
    println!("x <= y: {}", x <= y);
    println!("x >= y: {}", x >= y);
}

4.4 条件中使用 #

rust
fn main() {
    let condition = true;
    
    if condition {
        println!("条件为真");
    } else {
        println!("条件为假");
    }
    
    // 布尔表达式
    let number = 6;
    let is_even = number % 2 == 0;
    println!("{} 是偶数: {}", number, is_even);
}

五、字符类型 #

5.1 字符定义 #

Rust的 char 类型是4字节,代表一个Unicode标量值:

rust
fn main() {
    let c = 'z';
    let z = 'ℤ';
    let heart = '❤';
    let chinese = '中';
    
    println!("c: {}", c);
    println!("z: {}", z);
    println!("heart: {}", heart);
    println!("chinese: {}", chinese);
}

5.2 字符大小 #

rust
fn main() {
    println!("char 大小: {} 字节", std::mem::size_of::<char>());
    // 输出:char 大小: 4 字节
    
    let c = 'A';
    println!("'{}' 的 Unicode: U+{:04X}", c, c as u32);
}

5.3 转义字符 #

rust
fn main() {
    let newline = '\n';
    let tab = '\t';
    let backslash = '\\';
    let quote = '\'';
    let double_quote = '\"';
    
    // Unicode转义
    let unicode = '\u{1F600}';
    
    println!("newline: [{}]", newline);
    println!("tab: [{}]", tab);
    println!("unicode: {}", unicode);
}

5.4 字符方法 #

rust
fn main() {
    let c = 'A';
    
    println!("is_alphabetic: {}", c.is_alphabetic());
    println!("is_numeric: {}", c.is_numeric());
    println!("is_alphanumeric: {}", c.is_alphanumeric());
    println!("is_lowercase: {}", c.is_lowercase());
    println!("is_uppercase: {}", c.is_uppercase());
    println!("is_whitespace: {}", c.is_whitespace());
    println!("is_ascii: {}", c.is_ascii());
    
    // 大小写转换
    println!("to_lowercase: {}", c.to_lowercase().next().unwrap());
    println!("to_uppercase: {}", 'a'.to_uppercase().next().unwrap());
}

5.5 字符与数字转换 #

rust
fn main() {
    // 字符转数字
    let c = '5';
    let digit = c.to_digit(10);
    println!("digit: {:?}", digit);  // Some(5)
    
    // 数字转字符
    let num: u32 = 65;
    let char_from_num = char::from_u32(num);
    println!("char: {:?}", char_from_num);  // Some('A')
    
    // ASCII字符
    let ascii = 'A';
    println!("ASCII值: {}", ascii as u8);  // 65
}

六、类型别名 #

6.1 使用 type 关键字 #

rust
type Kilometers = i32;
type Point = (i32, i32);

fn main() {
    let distance: Kilometers = 100;
    let point: Point = (10, 20);
    
    println!("Distance: {} km", distance);
    println!("Point: {:?}", point);
}

七、类型转换 #

7.1 as 关键字 #

rust
fn main() {
    // 整数转换
    let a: i32 = 100;
    let b: i64 = a as i64;
    
    // 浮点转整数(截断)
    let c: f64 = 3.7;
    let d: i32 = c as i32;
    
    // 整数转浮点
    let e: i32 = 5;
    let f: f64 = e as f64;
    
    println!("i32 -> i64: {}", b);
    println!("f64 -> i32: {}", d);  // 3
    println!("i32 -> f64: {}", f);
}

7.2 TryInto trait #

rust
use std::convert::TryInto;

fn main() {
    let big: i64 = 1_000_000_000;
    
    // 安全转换
    match big.try_into() {
        Ok(small) => println!("i32: {}", small),
        Err(e) => println!("转换失败: {}", e),
    }
}

八、实践示例 #

8.1 温度转换 #

rust
fn main() {
    let celsius: f64 = 25.0;
    let fahrenheit = celsius * 9.0 / 5.0 + 32.0;
    
    println!("{}°C = {}°F", celsius, fahrenheit);
    
    let f: f64 = 77.0;
    let c = (f - 32.0) * 5.0 / 9.0;
    
    println!("{}°F = {}°C", f, c);
}

8.2 字符统计 #

rust
fn main() {
    let text = "Hello, 世界!";
    let mut letter_count = 0;
    let mut digit_count = 0;
    let mut other_count = 0;
    
    for c in text.chars() {
        if c.is_alphabetic() {
            letter_count += 1;
        } else if c.is_numeric() {
            digit_count += 1;
        } else {
            other_count += 1;
        }
    }
    
    println!("字母: {}", letter_count);
    println!("数字: {}", digit_count);
    println!("其他: {}", other_count);
}

九、总结 #

本章学习了:

  • 整数类型及其字面量表示
  • 浮点类型和数学运算
  • 布尔类型和逻辑运算
  • 字符类型和Unicode支持
  • 类型别名和类型转换

Rust的类型系统保证了类型安全,理解基本类型是学习Rust的基础。下一章,我们将学习类型推断与转换。

最后更新:2026-03-27