rust 【入门】03- 数据类型

36 阅读2分钟

/**

Rust 的数据类型可以分成两大类:标量类型(scalar types) 和 复合类型(compound types)。

标量类型

  • 无符号:u8, u16, u32, u64, u128, usize
  • 有符号:i8, i16, i32, i64, i128, isize
  • 单精度f32, 双精度f64
  • 其中usize是一个机器字,由系统架构决定,32 或者 64位
  • usize用于:数组的索引,内存的地址
  • 运算处理算法: checked_检查,wrapping_回绕(--release模式下的处理方式),saturating_饱和,overflowing_溢出(可理解:回绕+检查) 当在 debug 模式编译时,Rust 检查这类问题并使程序 panic 使用 --release flag 在 release 模式中构建时,Rust 不会检测会导致 panic 的整型溢出。相反发生整型溢出时,Rust 会进行一种被称为二进制补码 wrapping(two’s complement wrapping)的操作。简而言之,比此类型能容纳最大值还大的值会回绕到最小值,值 256 变成 0,值 257 变成 1,依此类推
  • 类型转换 */
pub async fn get_data_type_demo() -> () {
    // 后缀下划线表示
    let u_8 = 8_u8;
    // 前缀冒号表示
    let u_16:u16 = 16;
    // 不注明类型,默认是i32
    let u_32 = 32;
    // 单精度
    let f_32 = 32.0_f32;
    // 双精度, 不注明类型,默认是双精度
    let f_64 = 64.01;
    println!("u_8: {}, u_16: {}, u_32: {}", u_8, u_16, u_32);
    println!("f_32: {}, f_64: {}", f_32, f_64);

    // 类型转换
    let a: i32 = 10;
    // 使用as
    let b: i64 = a as i64;
    let c = i64::from(a);
    println!("b: {}, c: {}", b, c);

    // 检查:如果 checked_* 方法出现溢出,则返回 None值
    let d = a.checked_abs();
    // 回绕:
    let e = a.wrapping_add(a);
    // 饱和:用 saturating_* 方法在值的最小值或最大值处进行饱和处理
    let f = a.saturating_sub(b as i32);
    // 溢出:用 overflowing_* 方法返回值和一个布尔值,表示是否出现溢出
    let g = a.overflowing_mul(c as i32);

    // 一元运算符优先级,低于方法
    let h: i8 = (-2_i8).checked_abs().unwrap();

    println!("e: {}, f: {}, g: {}, h: {}", e, f, g.0, h);

    // 单个unicode, 32位
    let mut s = 'h';
    let mut s_cp = s;
    s = 'd';

    // 字符串字面量,在期生命周期中,固定的不可改变的
    let mut s_str = "hello world";

    // 改变绑定
    s_str = "change the world";

    println!("s: {}, s_cp: {}, s_str: {}", s, s_cp, s_str);
}