Rust基本类型
Rust基本类型
类型 - 整型
分类
整形再分类:
按符号
有符号整型,英文 signed,既可以存储正数,也可以存储负数。
无符号整型,因为 unsigned,只能存储正数。
按存储大小
- 整型可以进一步划分为 1字节、2字节、4字节、8字节、16字节
- 整型的长度还可以是 arch。arch 是由 CPU 构架决定的大小的整型类型。大小为 arch 的整数在 x86 机器上为 32 位,在 x64 机器上为 64 位
- 技巧:最大和最小值范围可以分别这样打印:
- 最大值 std
MAX,值为 340282366920938463463374607431768211455 - 最小值 std
MIN,值为 -170141183460469231731687303715884105728
- 最大值 std
| 大小 | 有符号 | 无符号 | |
|---|---|---|---|
| 8 bit | 1 Byte | i8 | u8 |
| 16 bit | 2 Byte | i16 | u16 |
| 32 bit (默认) | 4 Byte (默认) | i32 | u32 |
| 64 bit | 8 Byte | i64 | u64 |
| 128 bit | 16 Byte | i128 | u128 |
| Arch | isize | usize |
代码示例
let price = 100; // i32 默认
let price2:u32 = 200;
let price3:i32 = -300;
let price4:isize = 400;
let price5:usize = 500;
println!("price is {}", price);
// 输出 price is 100
println!("price2 is {} and price3 is {}", price3, price2);
// 输出 price2 is -300 and price3 is 200
println!("price4 is {} and price5 is {}", price4, price5);
// 输出 price4 is 400 and price5 is 500技巧:编译器提示
Rust有非常好的报错提示,报错非常清晰
类型和值不匹配
let price6:i32 = 66.66
// 编译不会通过,并且编译器报错如下
mismatched types [E0308] expected `i32`, found `f64`整型溢出
let price7:i8 = 192; // 我们已经计算了 i8 的最大值是 127。我给一个更大的数值会如何呢?
println!("price7 is {}", price7);
// 报错如下,很明确的告诉你超出了 i8 的范围
16 | let price7:i8=192;
| ^^^
|
= note: `#[deny(overflowing_literals)]` on by default
= note: the literal `192` does not fit into the type `i8` whose range is `-128..=127`
= help: consider using the type `u8` instead类型 - 浮点型
分类
按照存储大小,把浮点型划分为 f32 和 f64。其中 f64 是默认的浮点类型。
- f32 又称为 单精度浮点型。
- f64 又称为 双精度浮点型,它是 Rust 默认的浮点类型.
Rust 中不能将 0.0 赋值给任意一个整型,也不能将 0 赋值给任意一个浮点型。
代码示例
let price8:f64 = 99;
报错:mismatched types [E0308] expected `f64`, found `i32`
let price9 = 18.00; // 默认是 f64
let price10:f32 = 8.88;
let price11:f64 = 168.125; // 双精度浮点型
println!("price9 {}", price9); // 输出 price9 18
println!("price10 {}", price10); // 输出 price10 8.88
println!("price11 {}", price11); // 输出 price11 168.125技巧:下划线
当数字很大的时候,Rust 可以用 **(_下划线) ** ,来让数字变得可读性更好。
let price12 = 1_000_000;
println!("price12 {}", price12); // 输出 price12 1000000
let price13 = 1_000_000.666_123;
println!("price13 {}", price13); // 输出 price13 1000000.666123类型 - 布尔
Rust 使用 bool 关键字来声明一个 布尔类型 的变量。
布尔类型 取值是 true 或 false 。
let checked:bool = true;
println!("checked {}", checked); // 输出 checked true类型 - 字符
字符(char) ,就是字符串的基本组成部分,也就是单个字符或字。
Rust 使用 UTF-8 作为底层的编码 ,而不是常见的使用 ASCII 作为底层编码。
Rust 中的 字符数据类型 包含了 数字、字母、Unicode 和 其它特殊字符。
let c = 'R';
println!("c {}", c); // 输出 c R类型 - 单元
单元类型就是 () ,对,你没看错,就是 () ,唯一的值也是 () ,一些读者读到这里可能就不愿意了,你也太敷衍了吧,管这叫类型?
只能说,再不起眼的东西,都有其用途,在目前为止的学习过程中,大家已经看到过很多次 fn main() 函数的使用吧?那么这个函数返回什么呢?
没错, main 函数就返回这个单元类型 (),你不能说 main 函数无返回值,因为没有返回值的函数在 Rust 中是有单独的定义的:发散函数( diverge function ),顾名思义,无法收敛的函数。
例如常见的 println!() 的返回值也是单元类型 ()。
再比如,你可以用 () 作为 map 的值,表示我们不关注具体的值,只关注 key。 这种用法和 Go 语言的 struct{} 类似,可以作为一个值用来占位,但是完全不占用任何内存。
运算符
Rust 语言支持以下四种运算符
- 算术运算符
- 位运算符
- 关系运算符
- 逻辑运算符
算术运算符
| 名称 | 运算符 |
|---|---|
| 加 | + |
| 减 | - |
| 乘 | * |
| 除 | / |
| 求余 | % |
注:Rust 语言不支持自增自减运算符 ++ 和 --
关系运算符
| 名称 | 运算符 | 说明 |
|---|---|---|
| 大于 | > | 如果左操作数大于右操作数则返回 true 否则返回 false |
| 小于 | < | 如果左操作数小于于右操作数则返回 true 否则返回 false |
| 大于等于 | >= | 如果左操作数大于或等于右操作数则返回 true 否则返回 false |
| 小于等于 | <= | 如果左操作数小于或等于右操作数则返回 true 否则返回 false |
| 等于 | == | 如果左操作数等于右操作数则返回 true 否则返回 false |
| 不等于 | != | 如果左操作数不等于右操作数则返回 true 否则返回 false |
逻辑运算符
| 名称 | 运算符 | 说明 |
|---|---|---|
| 逻辑与 | && | 两边的条件表达式都为真则返回 true 否则返回 false |
| 逻辑或 | || | 两边的条件表达式只要有一个为真则返回 true 否则返回 false |
| 逻辑非 | ! | 如果表达式为真则返回 false 否则返回 true |
位运算
| 名称 | 运算符 | 说明 |
|---|---|---|
| 位与 | & | 相同位都是 1 则返回 1 否则返回 0 |
| 位或 | | | 相同位只要有一个是 1 则返回 1 否则返回 0 |
| 异或 | ^ | 相同位不相同则返回 1 否则返回 0 |
| 位非 | ! | 把位中的 1 换成 0 , 0 换成 1 |
| 左移 | << | 操作数中的所有位向左移动指定位数,右边的位补 0 |
| 右移 | >> | 操作数中的所有位向右移动指定位数,左边的位补 0 |