数值类型

86 阅读2分钟

概述

  • Rust 的数值类型包括整数和浮点数。
  • 整数没有小数部分,浮点数带有小数点。
  • Rust 支持运算符重载,允许在复杂类型上定义运算符。

整数类型

  • 整数分为有符号和无符号两种。
  • Rust 中的整数类型包括 i8, i16, i32, i64, i128 和 isize 以及对应的无符号类型 u8, u16, u32, u64, u128 和 usize。
  • 整数字面量可以使用不同的基数表示,例如十进制、十六进制、八进制、二进制。

整型溢出

  • Rust 在 debug 模式下会检查整型溢出并导致程序 panic。
  • release 模式下不检查溢出,而是按照补码循环溢出规则处理。
  • 可以使用标准库提供的方法显式处理溢出,例如 wrapping_add。

浮点类型

  • Rust 的浮点类型有 f32 和 f64,分别对应 32 位和 64 位。
  • 默认浮点类型是 f64,因为它在现代 CPU 中的速度与 f32 相近但精度更高。

浮点数陷阱

  1. 浮点数是近似值,无法精确表示所有十进制小数。
  2. 浮点数不能用于 HashMap 的键,因为它们没有实现 Eq 特征。

数字运算

  • Rust 支持基本的数学运算:加法、减法、乘法、除法和取模。
  • 运算符与其他语言一致。

位运算

  • Rust 的位运算包括:位与 (&)、位或 (|)、异或 (^)、位非 (!)、左移 (<<) 和右移 (>>)。

序列(Range)

  • Rust 提供序列来生成连续数值,例如 1..5 生成从 1 到 4 的数字。

类型转换

  • Rust 使用 as 关键字进行显式类型转换。

有理数和复数

  • Rust 标准库不包含有理数和复数,但社区提供了 num 库。

代码示例

fn main() {
    // 整数类型示例
    let a: u8 = 255;
    let b = a.wrapping_add(20);
    println!("{}", b); // 输出 19

    // 浮点数示例
    let x = 2.0; // f64
    let y: f32 = 3.0; // f32

    // 浮点数陷阱示例
    assert!(0.1 + 0.2 == 0.3); // 这将 panic,因为浮点数的精度问题

    // 位运算示例
    let a:i32 = 2;
    let b:i32 = 3;
    println!("(a & b) value is {}", a & b);

    // 序列示例
    for i in 1..=5 {
        println!("{}", i);
    }

    // 类型转换示例
    let decimal: f32 = 42.0;
    let integer: i32 = decimal as i32;

    // 复数使用示例
    use num::complex::Complex;
    let a = Complex { re: 2.1, im: -1.2 };
    let b = Complex::new(11.1, 22.2);
    let result = a + b;
    println!("{} + {}i", result.re, result.im);
}

总结

  • Rust 的数值类型丰富,需要根据需求选择合适的类型。
  • 类型转换必须是显式的。
  • Rust 的数值类型可以使用方法进行操作。