|
|
@ -6,7 +6,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
在 Rust 中,任何值都属于一种明确的**类型**(*type*),声明它被指定了何种数据,以便明确其处理方式。我们将分两部分探讨一些内建类型:标量(scalar)和复合(compound)。
|
|
|
|
在 Rust 中,任何值都属于一种明确的**类型**(*type*),声明它被指定了何种数据,以便明确其处理方式。我们将分两部分探讨一些内建类型:标量(scalar)和复合(compound)。
|
|
|
|
|
|
|
|
|
|
|
|
Rust 是一个**静态类型**(*statically typed*)语言,也就是说在编译时就须要知道所有变量的类型,这一认知将贯穿整个章节,请在头脑中保持。通过值的形式及其使用方式,编译器通常可以推断出我们想要用的类型。当多种类型均有可能,比如第二章中使用 `parse` 将 `String` 转换为数字类型,必须增加类型注解,像这样:
|
|
|
|
Rust 是**静态类型**(*statically typed*)语言,也就是说在编译时就需要知道所有变量的类型,这一认知将贯穿整个章节,请在头脑中明确。通过值的形式及其使用方式,编译器通常可以推断出我们想要用的类型。多种类型均有可能时,比如第二章中使用 `parse` 将 `String` 转换为数字,必须增加类型注解,像这样:
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
```rust
|
|
|
|
let guess: u32 = "42".parse().expect("Not a number!");
|
|
|
|
let guess: u32 = "42".parse().expect("Not a number!");
|
|
|
@ -44,13 +44,13 @@ error[E0282]: unable to infer enough type information about `_`
|
|
|
|
| 64-bit | i64 | u64 |
|
|
|
|
| 64-bit | i64 | u64 |
|
|
|
|
| arch | isize | usize |
|
|
|
|
| arch | isize | usize |
|
|
|
|
|
|
|
|
|
|
|
|
每一种变体都可以是有符号或无符号的,并有一个明确的大小。有符号和无符号代表数字能否为负值;换句话说,数字是否需要有一个符号(有符号数),或者永远为正的而不需要符号(无符号数)。这有点像在纸上书写数字:当需要考虑符号的时候,数字前面会加上一个加号或减号;然而,当可以安全地假设为正数时,可以不带符号(加号)。有符号数以二进制补码形式(two’s complement representation)存储(如果你不清楚这是什么,可以在网上搜索;对其的解释超出了本书的范畴)。
|
|
|
|
每一种变体都可以是有符号或无符号的,并有一个明确的大小。有符号和无符号代表数字能否为负值;换句话说,数字是否需要有一个符号(有符号数),或者永远为正而不需要符号(无符号数)。这有点像在纸上书写数字:当需要考虑符号的时候,数字以加号或减号作为前缀;然而,可以安全地假设为正数时,加号前缀通常省略。有符号数以二进制补码形式(two’s complement representation)存储(如果你不清楚这是什么,可以在网上搜索;对其的解释超出了本书的范畴)。
|
|
|
|
|
|
|
|
|
|
|
|
每一个有符号的变体可以储存包含从 -(2<sup>n - 1</sup>) 到 2<sup>n - 1</sup> - 1 在内的数字,这里 `n` 是变体使用的位数。所以 `i8` 可以储存从 -(2<sup>7</sup>) 到 2<sup>7</sup> - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2<sup>n</sup> - 1 的数字,所以 `u8` 可以储存从 0 到 2<sup>8</sup> - 1 的数字,也就是从 0 到 255。
|
|
|
|
每一个有符号的变体可以储存包含从 -(2<sup>n - 1</sup>) 到 2<sup>n - 1</sup> - 1 在内的数字,这里 `n` 是变体使用的位数。所以 `i8` 可以储存从 -(2<sup>7</sup>) 到 2<sup>7</sup> - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2<sup>n</sup> - 1 的数字,所以 `u8` 可以储存从 0 到 2<sup>8</sup> - 1 的数字,也就是从 0 到 255。
|
|
|
|
|
|
|
|
|
|
|
|
另外,`isize` 和 `usize` 类型依赖运行程序的计算机架构:64 位架构上他们是 64 位的, 32 位架构上他们是 32 位的。
|
|
|
|
另外,`isize` 和 `usize` 类型依赖运行程序的计算机架构:64 位架构上他们是 64 位的, 32 位架构上他们是 32 位的。
|
|
|
|
|
|
|
|
|
|
|
|
可以使用表格 3-2 中的任何一种形式编写数字字面值。注意除了字节以外的字面值允许使用类型后缀,例如 `57u8`,可以使用 `_` 做为分隔符以方便读数,例如 `1_000` (分隔符的数量与位置并不影响实际的数字)。
|
|
|
|
可以使用表格 3-2 中的任何一种形式编写数字字面值。除字节以外的其它字面值允许使用类型后缀,例如 `57u8`,允许使用 `_` 做为分隔符以方便读数,例如 `1_000` (分隔符的数量与位置并不影响实际的数字)。
|
|
|
|
|
|
|
|
|
|
|
|
<span class="caption">Table 3-2: Integer Literals in Rust</span>
|
|
|
|
<span class="caption">Table 3-2: Integer Literals in Rust</span>
|
|
|
|
|
|
|
|
|
|
|
@ -62,7 +62,7 @@ error[E0282]: unable to infer enough type information about `_`
|
|
|
|
| Binary | `0b1111_0000` |
|
|
|
|
| Binary | `0b1111_0000` |
|
|
|
|
| Byte (`u8` only) | `b'A'` |
|
|
|
|
| Byte (`u8` only) | `b'A'` |
|
|
|
|
|
|
|
|
|
|
|
|
那么该使用哪种类型的数字呢?如果拿不定主意,Rust 的默认类型通常就是很好的选择,数字类型默认是 `i32`:它通常是最快的,甚至在 64 位系统上也是。`isize` 或 `usize` 的主要使用场景是作为集合的索引。
|
|
|
|
那么该使用哪种类型的数字呢?如果拿不定主意,Rust 的默认类型通常就是很好,数字类型默认是 `i32`:它通常是最快的,甚至在 64 位系统上也是。`isize` 或 `usize` 的主要作为集合的索引。
|
|
|
|
|
|
|
|
|
|
|
|
#### 浮点型
|
|
|
|
#### 浮点型
|
|
|
|
|
|
|
|
|
|
|
|