Rust 是静态编译语言,在编译时必须知道所有变量的类型。
基于使用的值,编译器通常能推断出它的具体类型,但如果可能的类型比较多,例如把String转换为整数的parse方法,就必须添加类型的标注,否则编译会报错。
//报错:程序不知道把字符串转换成啥类型
let guess = "42".parse().expect("Not a number");
//正确:程序知道要转换成u32类型
let guess:u32 = "42".parse().expect("Not a number");
在rust中,每个值都有其确切的数据类型,总的来说可以分为两类:标量类型和复合类型。
一个标量类型意味着它代表的是一个单个的值,rust有三个主要的标量类型:
- 数值类型: 有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 、浮点数 (f32, f64)
- 布尔类型: true和false
- 字符类型: 表示单个 Unicode 字符,存储为 4 个字节
复合类型,顾名思义,是指由多个标量类型的值和其他符号组合而成的数据类型。
Rust内置的复合类型有:元组、数组。
一、标量类型
(一)整数类型
比如 i32 类型(rust默认的整数值类型),表示的就是有符号的 32 位整数类型( i 是英文单词 integer 的首字母,与之相反的是 u,代表无符号 unsigned 类型)。下表显示了 Rust 中的内置的整数类型:
长度(视架构而定) | 有符号类型 | 无符号类型 |
---|---|---|
8 位 | i8 | u8 |
16 位 | i16 | u16 |
32 位 | i32 | u32 |
64 位 | i64 | u64 |
arch(架构位数,如128) | isize(i128) | usize(u128) |
类型定义的形式统一为:有无符号 + 类型大小(位数)。无符号数表示数字只能取正数和0,而有符号则表示数字可以取正数、负数还有0。就像在纸上写数字一样:当要强调符号时,数字前面可以带上正号或负号;然而,当很明显确定数字为正数时,就不需要加上正号了。有符号数字以补码形式存储。
每个有符号类型规定的数字范围是 -(2n - 1) ~ 2n - 1 - 1,其中 n 是该定义形式的位长度。因此 i8 可存储数字范围是 -(27) ~ 27 - 1,即 -128 ~ 127。无符号类型可以存储的数字范围是 0 ~ 2n - 1,所以 u8 能够存储的数字为 0 ~ 28 - 1,即 0 ~ 255。
整数溢出
例如:u8的范围是0-255,如果你把一个u8变量的值设为256,那么
- 在调试模式下:rust会检查整数溢出,如果发生溢出,程序在运行时会报错。
- 在发布模式下(–release):rust不会检查可能导致报错的整数溢出。如果溢出发生,会执行“环绕”操作,就像一个钟表一样转圈,将256变成0,257变成1…以此类推,且不会报错。
(二)浮点类型
浮点类型数字 是带有小数点的数字,在 Rust 中浮点类型数字也有两种基本类型: f32 和 f64,分别为 32 位和 64 位大小。默认浮点类型是 f64,在现代的 CPU 中它的速度与 f32 几乎相同,但精度更高。
下面是一个演示浮点数的示例:
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
浮点数根据 IEEE-754 标准实现。f32 类型是单精度浮点型,f64 为双精度。
(三)字符类型
Rust 的 char 类型是语言中最原生的字母类型。下面是一些声明 char 值的例子:
fn