Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

3.2 数据类型:标量类型

3.2.0. 写在正文之前

欢迎来到Rust自学的第三章,一共有6个小节,分别是:

通过第二章的小游戏(没看的初学者强烈建议看一下),相信你已经学会了基本的Rust语法,而在第三章我们将更深一层,了解Rust中的通用的编程概念。

3.2.1. Rust中的变量特性

Rust是静态编译语言,因此编译器在编译时必须知道每个变量的类型。

  • 基于使用的值,编译器通常能够推断出它的具体类型。
  • 如果可能的类型比较多,就必须添加类型标注,否则编译会失败。以下是一个例子:
#![allow(unused)]
fn main() {
let guess = "6657".parse().expect("Please enter a number");
}

如果你把这句话放到IDE中,你就会发现类似error[E0284]: type annotations needed的错误。这是因为字符串6657可以被解析成i32u32等类型,编译器不知道你想要哪一种,所以需要显式标注类型。将代码改成如下即可编译通过:

#![allow(unused)]
fn main() {
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位,能表示从02^32 - 1的值。
  • Rust的整数类型列表如下:
    • 每种都分iu,以及固定的位数。
    • 有符号范围:-(2^(n-1))2^(n-1) - 1
    • 无符号范围:02^n - 1
LengthSignedUnsigned
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize

isizeusize类型是比较特殊的两个整数类型,其大小由程序运行的计算机架构所决定:

  • 在64位机器上,它们是64位。isize相当于i64usize相当于u64
  • 在32位机器上,它们是32位。isize相当于i32usize相当于u32

使用isizeusize的主要场景是对某种集合进行索引操作。

fn main(){
	let machine: u32 = 6657;
}

3.2.4. 整数字面值

整数不一定是十进制的,也支持其他进制。使用固定格式能让程序理解你使用的进制,也使别人更容易读懂你的代码。

Number literalsExample
Decimal98_222
Hex0xff
Octal0o77
Binary0b1111_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的布尔类型与其他语言无异。它有两个值:truefalse,占一个字节,关键字是bool

fn main(){
	let machine: bool = true;
}

3.2.9. 字符类型

  • Rust的char类型用来表示语言中最基础的单个字符。
  • 字符字面值使用单引号。
  • 占用4个字节。
  • 它是Unicode标量值,因此可以表示远超ASCII的内容,包括拼音、中日韩文、零宽字符、emoji等。其范围是从U+0000U+D7FF以及从U+E000U+10FFFF
  • Unicode实际上并没有我们通常理解的那种“字符”概念,所以直觉上认识的字符也许与Rust中的概念并不完全对应。
fn main(){
	let x: char = '🥵';
}