/**
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);
}