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 |