3.2.0. 写在正文之前
欢迎来到Rust自学的第三章,一共有6个小节,分别是:
- 变量与可变性
- 数据类型:标量类型(本文)
- 数据类型:复合类型
- 函数和注释
- 控制流:
if else
- 控制流:循环
通过第二章的小游戏(没看的初学者强烈建议看一下),相信你已经学会了基本的Rust语法,而在第三章我们将更深一层,了解Rust中的通用的编程概念。
喜欢的话记得点赞、收藏加关注哦,想要跟着学习可以关注专栏哦
3.2.1. Rust中的变量特性
Rust是静态编译语言,在编译时必须知道所有变量的类型
- 基于使用的值,编译器通常能够推断出它的具体类型
- 如果可能的类型比较多,就必须添加类型的标注,否则编译会报错。一下是一个例子:
rust">let guess = “6657”.parse().expect("Please enter a number")
如果你把这句话放到IDE中,你就会发现IDE提示type error:type annotations needed
,这是因为6657这个值即可以被i32
、u32
等类型容纳,编译器不知道应该用哪个类型,就需要显示标注其类型。将代码改成如下即不会报错:
rust">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^31次方 - Rust的整数类型列表如图:
- 每种都分i和u,以及固定的位数
- 有符号范围:-(2^n - 1) 到 2^n - 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
的主要场景是对某种集合进行索引操作。
rust">fn main(){let machine:u32 = 6657;
}
3.2.4. 整数字面值
整数不一定是10进制的,也有其他的进制,使用固定的格式能让程序理解你使用的进制也使别人能看得懂你的代码。
Number literals | Example |
---|---|
Decimal | 98_222 |
Hex | 0xff |
Octal | 0o77 |
Binary | 0b1111_0000 |
Byte (u8 only) | b’A’ |
- 十进制中可以加上
_
来增加可读性 - 16进制以
0x
开头 - 8进制以
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
精度更高。
rust">fn main(){let machine:f32 = 6657.0721;
}
3.2.7. 数值操作
- 加:
+
- 减:
-
- 乘:
*
- 除:
/
- 余:
%
这些与其他语言无异
3.2.8. 布尔类型
Rust的布尔类型与其他语言无异,有两个值:true
和false
,占一个字节,关键字是bool
。
rust">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中的概念并不相符
rust">fn main(){let x:char = `🥵`;
}