|
|
|
@ -23,7 +23,7 @@ Rust使用一个相对传统的语法来创建整数(`1`,`2`,...)和浮点数(`1
|
|
|
|
|
| 128-位 | `i128` | `u128` |
|
|
|
|
|
| 视架构而定 | `isize` | `usize` |
|
|
|
|
|
|
|
|
|
|
类型定义的形式统一为:有无符号 + 类型大小(位数)。**无符号数**表示数字只能取正数,而**有符号**则表示数字即可以取正数又可以取负数。就像在纸上写数字一样:当要强调符号时,数字前面可以带上正号或负号;然而,当很明显确定数字为正数时,就不需要加上正号了。有符号数字以[二进制补码](https://en.wikipedia.org/wiki/Two%27s_complement)形式存储。
|
|
|
|
|
类型定义的形式统一为:有无符号 + 类型大小(位数)。**无符号数**表示数字只能取正数,而**有符号**则表示数字即可以取正数又可以取负数。就像在纸上写数字一样:当要强调符号时,数字前面可以带上正号或负号;然而,当很明显确定数字为正数时,就不需要加上正号了。有符号数字以[补码](https://en.wikipedia.org/wiki/Two%27s_complement)形式存储。
|
|
|
|
|
|
|
|
|
|
每个有符号类型规定的数字范围是 -(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。
|
|
|
|
@ -48,11 +48,11 @@ Rust使用一个相对传统的语法来创建整数(`1`,`2`,...)和浮点数(`1
|
|
|
|
|
>
|
|
|
|
|
> 比方说有一个 `u8` ,它可以存放从 0 到 255 的值。那么当你将其修改为范围之外的值,比如 256,则会发生**整型溢出**。关于这一行为 Rust 有一些有趣的规则:当在 debug 模式编译时,Rust 会检查整型溢出,若存在这些问题,则使程序在编译时 *panic*(崩溃,Rust 使用这个术语来表明程序因错误而退出)。
|
|
|
|
|
>
|
|
|
|
|
> 在当使用 `--release` 参数进行 release 模式构建时,Rust **不**检测溢出。相反当检测到整型溢出时,Rust 会进行一种被称为二进制补码的方式进行(*two’s complement wrapping*)操作。简而言之,大于该类型最大值的数值会被补码转换成该类型能够支持的对应数字的最小值。比如在 `u8` 的情况下,256 变成 0,257 变成 1,依此类推。程序不会 panic,但是该变量的值可能不是你期望的值。依赖整型溢出的行为不是一种正确的做法。
|
|
|
|
|
> 在当使用 `--release` 参数进行 release 模式构建时,Rust **不**检测溢出。相反,当检测到整型溢出时,Rust 会按照补码循环溢出(*two’s complement wrapping*)的规则处理。简而言之,大于该类型最大值的数值会被补码转换成该类型能够支持的对应数字的最小值。比如在 `u8` 的情况下,256 变成 0,257 变成 1,依此类推。程序不会 panic,但是该变量的值可能不是你期望的值。依赖这种默认行为的代码都应该被认为是错误的代码。
|
|
|
|
|
>
|
|
|
|
|
> 要显式处理溢出的可能性,可以使用标准库针对原始数字类型提供的以下的一系列方法:
|
|
|
|
|
> 要显式处理可能的溢出,可以使用标准库针对原始数字类型提供的这些方法:
|
|
|
|
|
>
|
|
|
|
|
> - 使用 `wrapping_*` 方法在所有模式下进行包裹,例如 `wrapping_add`
|
|
|
|
|
> - 使用 `wrapping_*` 方法在所有模式下都按照补码循环溢出规则处理,例如 `wrapping_add`
|
|
|
|
|
> - 如果使用 `checked_*` 方法时发生溢出,则返回 `None` 值
|
|
|
|
|
> - 使用 `overflowing_*` 方法返回该值和一个指示是否存在溢出的布尔值
|
|
|
|
|
> - 使用 `saturating_*` 方法使值达到最小值或最大值
|
|
|
|
|