基本类型
数值类型: 有符号整数 (i8
, i16
, i32
, i64
, isize
)、 无符号整数 (u8
, u16
, u32
, u64
, usize
) 、浮点数 (f32
, f64
)、以及有理数、复数
字符串:字符串字面量和字符串切片 &str
布尔类型: true
和false
字符类型: 表示单个 Unicode 字符,存储为 4 个字节
单元类型: 即 ()
,其唯一的值也是 ()
Rust 编译器很聪明,它可以根据变量的值和上下文中的使用方式来自动推导出变量的类型,同时编译器也不够聪明,在某些情况下,它无法推导出变量类型,需要手动去给予一个显式的类型标注
Ax 数值类型
整数类型
整数是没有小数部分的数字。之前使用过的 i32 类型,表示有符号的 32 位整数( i 是英文单词 integer 的首字母,与之相反的是 u,代表无符号 unsigned 类型)。下表显示了 Rust 中的内置的整数类型:
Rust 整型默认使用 i32
长度 | 有符号类型 | 无符号类型 |
---|---|---|
8 位 | i8 | u8 |
16 位 | i16 | u16 |
32 位 | i32 | u32 |
64 位 | i64 | u64 |
128 位 | i128 | u128 |
视架构而定 | isize | usize |
整形字面量可以用下表的形式书写:
数字字面量 | 示例 |
---|---|
十进制 | 98_222 |
十六进制 | 0xff |
八进制 | 0o77 |
二进制 | 0b1111_0000 |
字节 (仅限于 u8) | b'A' |
整数溢出:
当在 debug 模式编译时,Rust 会检查整型溢出,若存在这些问题,则使程序在编译时 panic(崩溃,Rust 使用这个术语来表明程序因错误而退出)。
在当使用 --release 参数进行 release 模式构建时,Rust 不检测溢出。相反,当检测到整型溢出时,Rust 会按照补码循环溢出(two’s complement wrapping)的规则处理。简而言之,大于该类型最大值的数值会被补码转换成该类型能够支持的对应数字的最小值。比如在 u8 的情况下,256 变成 0,257 变成 1,依此类推。程序不会 panic,但是该变量的值可能不是你期望的值。依赖这种默认行为的代码都应该被认为是错误的代码。
浮点类型
浮点类型数字 是带有小数点的数字,在 Rust 中浮点类型数字也有两种基本类型: f32 和 f64,分别为 32 位和 64 位大小。默认浮点类型是 f64,在现代的 CPU 中它的速度与 f32 几乎相同,但精度更高。
数字运算
fn main() {
// 加法
let sum = 5 + 10;
// 减法
let difference = 95.5 - 4.3;
// 乘法
let product = 4 * 30;
// 除法
let quotient = 56.7 / 32.2;
// 求余
let remainder = 43 % 5;
}
位运算
Rust的运算基本上和其他语言一样
运算符 | 说明 |
---|---|
& 位与 | 相同位置均为1时则为1,否则为0 |
位或 | |
^ 异或 | 相同位置不相同则为1,相同则为0 |
! 位非 | 把位中的0和1相互取反,即0置为1,1置为0 |
<< 左移 | 所有位向左移动指定位数,右位补零 |
>> 右移 | 所有位向右移动指定位数,左位补零 |
序列
序列(Range)只用于数字和字符。
Rust 提供了一个非常简洁的方式,用来生成连续的数值。 1..=5,'a'..='z'
有理数和复数
Rust并没有把有理数和复数放标准库里,而是开发了高质量的num数值库。
Bx 字符串类型
Rust 的字符不仅仅是 ASCII,所有的 Unicode 值都可以作为 Rust 字符,由于 Unicode 都是 4 个字节编码,因此字符类型也是占用 4 个字节。
Cx 布尔类型
Rust 中的布尔类型有两个可能的值:true 和 false,布尔值占用内存的大小为 1 个字节,多用于流程控制。
Dx 单元类型
()
例:
main()
println!()
Ex 语句和表达式
语句(statement)和表达式(expression)是函数体基本的构成,不用多少重要性。
语句是基本单位不返回值,表达式求值返回值。
代码行结束时有分号就是语句,如没有就是表达式。