3.2 数据类型:标量类型
3.2.0. 写在正文之前
欢迎来到Rust自学的第三章,一共有6个小节,分别是:
- 变量与可变性
-数据类型:标量类型(本文)
- 数据类型:复合类型
- 函数和注释
- 控制流:if else
- 控制流:循环
通过第二章的小游戏(没看的初学者强烈建议看一下),相信你已经学会了基本的Rust语法,而在第三章我们将更深一层,了解Rust中的通用的编程概念。
3.2.1. Rust中的变量特性
Rust是静态编译语言,因此编译器在编译时必须知道每个变量的类型。
- 基于使用的值,编译器通常能够推断出它的具体类型。
- 如果可能的类型比较多,就必须添加类型标注,否则编译会失败。以下是一个例子:
let guess = "6657".parse().expect("Please enter a number");如果你把这句话放到IDE中,你就会发现类似error[E0284]: type annotations needed的错误。这是因为字符串6657可以被解析成i32或u32等类型,编译器不知道你想要哪一种,所以需要显式标注类型。将代码改成如下即可编译通过:
let guess: u32 = "6657".parse().expect("Please enter a number");3.2.2. 标量类型的简介
- 一个标量类型代表一个单一的值。
- Rust主要有4个标量类型:
- 整数类型
- 浮点类型
- 布尔类型
- 字符类型
3.2.3. 整数类型
- 无符号整数类型(不能表示负数)以
u开头,u是unsigned的简写。 - 有符号整数类型(可以表示负数)以
i开头,i是integer的简写。 - 字母后的数字表示该类型占据多少位。例如,
u32中的32表示它使用32位,能表示从0到2^32 - 1的值。 - Rust的整数类型列表如下:
- 每种都分
i和u,以及固定的位数。 - 有符号范围:
-(2^(n-1))到2^(n-1) - 1 - 无符号范围:
0到2^n - 1
| Length | Signed | Unsigned |
|---|---|---|
| 8-bit | i8 | u8 |
| 16-bit | i16 | u16 |
| 32-bit | i32 | u32 |
| 64-bit | i64 | u64 |
| 128-bit | i128 | u128 |
| arch | isize | usize |
isize和usize类型是比较特殊的两个整数类型,其大小由程序运行的计算机架构所决定:
- 在64位机器上,它们是64位。isize相当于i64,usize相当于u64。
- 在32位机器上,它们是32位。isize相当于i32,usize相当于u32。
使用isize和usize的主要场景是对某种集合进行索引操作。
fn main(){ let machine: u32 = 6657; }3.2.4. 整数字面值
整数不一定是十进制的,也支持其他进制。使用固定格式能让程序理解你使用的进制,也使别人更容易读懂你的代码。
| Number literals | Example |
|---|---|
| Decimal | 98_222 |
| Hex | 0xff |
| Octal | 0o77 |
| Binary | 0b1111_0000 |
| Byte (u8 only) | b'A' |
- 十进制中可以加上下划线来增强可读性。
- 十六进制以
0x开头。 - 八进制以
0o开头。 - 二进制以
0b开头,也可以加上下划线来增强可读性。 - 字节字面值比较特殊。在Rust中,字节整数字面值写作
b'X',其中X是表示一个字节值的单个字符。这种字面值只能用于u8,因为字节值的范围是0到255,且X必须是ASCII字符。例如,b'A'的值是65,因为A的ASCII码是65。 - 除了字节字面值,所有数值字面值都可以使用类型后缀。
- 如果不太清楚该使用哪种类型,可以依赖Rust相应的默认类型。
- 整数的默认类型是
i32,总体上来说速度很快,即使是在64位系统中。
3.2.5. 整数溢出
举个例子,u8的范围是0到255。如果把一个u8变量的值设为256,会出现两种情况:
- 在调试构建中,Rust会检查溢出。如果发生溢出,程序会在运行时panic。
- 在发布构建(--release)中,Rust不会检查可能导致panic的溢出。
- 如果确实发生溢出,Rust会执行环绕运算:256变成0,257变成1,以此类推,但不会panic。
3.2.6. 浮点类型
Rust有两种基础的浮点类型:
-f32:32位单精度
-f64:64位双精度
Rust使用IEEE-754标准来表示浮点类型。
f64是默认类型,因为在现代CPU中,f64的运行速度与f32差不多,而且f64精度更高。
fn main(){ let machine: f32 = 6657.0721; }3.2.7. 数值操作
- 加:
+ - 减:
- - 乘:
* - 除:
/ - 余:
%
这些与其他语言无异。
3.2.8. 布尔类型
Rust的布尔类型与其他语言无异。它有两个值:true和false,占一个字节,关键字是bool。
fn main(){ let machine: bool = true; }3.2.9. 字符类型
- Rust的
char类型用来表示语言中最基础的单个字符。 - 字符字面值使用单引号。
- 占用4个字节。
- 它是Unicode标量值,因此可以表示远超ASCII的内容,包括拼音、中日韩文、零宽字符、emoji等。其范围是从
U+0000到U+D7FF以及从U+E000到U+10FFFF。 - Unicode实际上并没有我们通常理解的那种“字符”概念,所以直觉上认识的字符也许与Rust中的概念并不完全对应。
fn main(){ let x: char = '🥵'; }