类型,第一部分 (Types, part 1)

"语法"章节中,compute 的输入参数类型为 u32
让我们来详细解释一下这_意味着_什么。

基本类型 (Primitive types)

u32 是 Rust 的基本类型 (primitive types) 之一。基本类型是语言中最基础的构建块。 它们内置于语言本身——也就是说,它们不是用其他类型来定义的。

你可以组合这些基本类型来创建更复杂的类型。我们很快就会看到如何做到这一点。

整数 (Integers)

u32 特别地,是一个无符号 32 位整数 (unsigned 32-bit integer)

整数 (integer) 是一个可以不带小数部分书写的数字。例如 1 是一个整数,而 1.2 不是。

有符号 (Signed) vs. 无符号 (Unsigned)

整数可以是有符号 (signed)无符号 (unsigned) 的。
无符号整数只能表示非负数(即 0 或更大的数)。 有符号整数可以表示正数和负数(例如 -112 等)。

u32 中的 u 代表无符号 (unsigned)
有符号整数的等效类型是 i32,其中 i 代表整数 (integer),即可以是正数或负数的任何整数。

位宽 (Bit width)

u32 中的 32 指的是用于在内存中表示数字的位数1
位数越多,能表示的数字范围就越大。

Rust 支持多种位宽的整数:8163264128

使用 32 位,u32 可以表示从 02^32 - 1 的数字(也称为 u32::MAX)。
使用相同数量的位数,有符号整数(i32)可以表示从 -2^312^31 - 1 的数字 (即从 i32::MINi32::MAX)。
i32 的最大值小于 u32 的最大值,因为有一位用于表示数字的符号。查看二进制补码表示法了解更多关于有符号整数在内存中表示方式的详细信息。

总结

结合两个变量(有符号/无符号和位宽),我们得到以下整数类型:

位宽 (Bit width)有符号 (Signed)无符号 (Unsigned)
8 位i8u8
16 位i16u16
32 位i32u32
64 位i64u64
128 位i128u128

字面量 (Literals)

字面量 (literal) 是在源代码中表示固定值的记号。
例如,42 是表示数字四十二的 Rust 字面量。

字面量的类型注解

但是 Rust 中的所有值都有类型,那么... 42 的类型是什么?

Rust 编译器 (compiler) 会尝试根据字面量的使用方式来推断其类型。
如果你不提供任何上下文,编译器会将整数字面量默认为 i32
如果你想使用不同的类型,你可以添加所需的整数类型作为后缀——例如,2u64 就是一个显式类型为 u64 的 2。

字面量中的下划线

你可以使用下划线 _ 来提高大数字的可读性。
例如,1_000_0001000000 相同。

算术运算符 (Arithmetic operators)

Rust 支持以下整数的算术运算符2

  • + 加法 (addition)
  • - 减法 (subtraction)
  • * 乘法 (multiplication)
  • / 除法 (division)
  • % 取余 (remainder)

这些运算符的优先级和结合性与数学中的相同。
你可以使用括号来覆盖默认的优先级。例如 2 * (3 + 4)

⚠️ 警告 (Warning)

除法运算符 / 在用于整数类型时执行整数除法。 也就是说,结果会向零截断。例如,5 / 22,而不是 2.5

无自动类型强制转换 (No automatic type coercion)

正如我们在上一个练习中讨论的,Rust 是一种静态类型语言。
特别是,Rust 对类型强制转换 (type coercion) 非常严格。它不会自动将值从一种类型转换为另一种类型3, 即使转换是无损的。你必须显式地进行转换。

例如,你不能将 u8 值赋给类型为 u32 的变量,即使所有 u8 值都是有效的 u32 值:

let b: u8 = 100;
let a: u32 = b;

它会抛出编译错误:

error[E0308]: mismatched types
  |
3 |     let a: u32 = b;
  |            ---   ^ expected `u32`, found `u8`
  |            |
  |            expected due to this
  |

我们将在本课程的后面部分看到如何在类型之间进行转换。

进一步阅读

1

位 (bit) 是计算机中最小的数据单位。它只能有两个值:01

2

Rust 不允许你定义自定义运算符,但它让你控制内置运算符的行为。 我们将在课程中稍后讨论运算符重载,在我们介绍了特质 (trait) 之后。

3

这个规则有一些例外,主要与引用、智能指针和人体工程学有关。我们将在稍后介绍。 "所有转换都是显式的"这个心理模型在现阶段会对你很有帮助。

原文链接:英文原文