diff --git a/src/programming_concepts/data_types.md b/src/programming_concepts/data_types.md
index 8f8ce64..ad27724 100644
--- a/src/programming_concepts/data_types.md
+++ b/src/programming_concepts/data_types.md
@@ -43,13 +43,16 @@ error: could not compile `data_types` (bin "data_types") due to previous error
**Scalar Types**
-*标量* 类型,表示单个值。Rust 有着四个主要的标量类型:整数、浮点数、布尔值与字符。这些类型,其他语言也有。下面就深入看看他们在 Rust 中是怎样工作的。
+所谓 *标量,scalar* 类型,表示单个值。Rust 有四种主要的标量类型:整数、浮点数、布尔值和字符。咱们可能在其他编程语言中,见过这些类型。我们来了解一下,他们在 Rust 中是如何工作的。
-### 整形
+
+### 整形
**Integer Types**
-*整数* 是不带小数部分的数。在第 2 章中就已用到一种整数类型,即 `u32` 类型。这种类型声明表示变量关联的值,应是个无符号的、占据 32 个二进制位空间的整数(有符号整数以 `i` 而不是 `u` 开头)。下面的表 3-1 给出了 Rust 中内建的那些整数类型。可使用这些变种中的任何一个,取声明出某个整数值的类型。
+
+所谓 *整数,integer*,是没有小数部分的数字。我们在第 2 章中,曾使用了一种整数类型,即 `u32` 类型。该类型声明,表示与之关联的值,应该是个无符号整数(有符号整数类型以 `i`,而不是 `u` 开头),占用 32 位空间。下表 3-1 列出了 Rust 中,内置的整数类型。我们可以使用任何的这些变种,来声明某个整数值的类型。
+
*表 3-1:Rust 中的整数类型*
@@ -61,17 +64,17 @@ error: could not compile `data_types` (bin "data_types") due to previous error
| 32 位 | `i32` | `u32` |
| 64 位 | `i64` | `u64` |
| 128 位 | `i128` | `u128` |
-| 架构决定 | `isize` | `usize` |
+| 架构(arch) | `isize` | `usize` |
-这每个变种,都可以是有符号或无符号的,同时有着显式的大小(二进制位数)。 *有符号* 与 *无符号* 是该数字是否可以是负数--也就是说,该数是否需带有符号(即有符号的),或者说他是否将只为正数,而因此仅能被不带符号的表示出来(即无符号)。这与在纸上写数字相像:在符号重要时,那么写下来的数字就会带有加号或减号;不过在可安全地假定数字为正数时,写下的数字就不带符号了。有符号数字,是采用 [二进制补码](https://en.wikipedia.org/wiki/Two%27s_complement) 表示法加以存储的。
-每个有符号变种,都可存储自 `-(2^n-1)` 到 `2^n-1` 范围的那些数字(包括边界上的两个数字),其中的 `n` 即为变种用到的位数。那么一个 `i8` 就可以存储 从`-(2^7)` 到 `2^7-1` 的那些数字了,相当于 `-128` 到 `127`。
+其中每个变种,都可以是有符号或无符号的,并有明确的大小。*有符号,signed* 和 *无符号,unsigned*,指的是数字是否有可能是负数 -- 换句话说,数字是否需要带有符号(有符号),或者数字是否只能是正数,而因此可以不带符号表示(无符号)。这就像在纸上书写数字:当符号很重要时,数字会用加号或减号表示;然而,当可以肯定数字是正数时,数字就会不带符号给出。有符号的数字使用 [二进制补码表示法](https://en.wikipedia.org/wiki/Two%27s_complement) 存储。
-无符号变种则可以存储 `0` 到 `2^n - 1` 的数字,因此一个 `u8` 可以存储 `0` 到 `2^8 - 1` 的数字,相当于 `0` 到 `255`。
+每个带符号的变种,可以存储 -(2n - 1) 到 2n - 1 - 1(含)的数字,其中 *n* 是该变种使用的比特数。因此,`i8` 可以存储-(27) 到 27 - 1 的数字,相当于 -128 到 127。无符号变种可以存储 0 至 2n - 1 的数字,因此 `u8` 可以存储 0 至 28 - 1 的数字,相当于 0 至 255。
-此外,其中的 `isize` 与 `usize` 类型,取决于程序所运行计算机的架构,这在上面的表格中,是以 `arch` 表示的:若在 `64-bit` 机器上那么就是 64 位,而若在 `32-bit` 机器上,那么就是 32 位。
+此外,`isize` 和 `usize` 这两种类型,取决于咱们程序运行所在的计算机体系结构,这在该表中,用 “架构(arch)” 表示:如果咱们在 64 位架构上,则为 64 位;如果是在 32 位架构上,则为 32 位。
+
+咱们可以下表 3-2 所示的任何形式,写出整数的字面值。需要注意的是,可以是多种数值类型的数字字面值,则允许使用类型后缀,如 `57u8`,来指定类型。数字字面值,也可以使用 `_` 作为视觉分隔符,使数字更容易读取,例如 `1_000`,其将与咱们指定的 `1000` 相同。
-可使用上面表 3-2 中的任何形式,来编写整数字面值(integer literals)。请注意数字字面值是可以将多种数字类型,作为类型后缀(a type suffix),而指定出该数字的类型的,比如 `57u8`。数字字面值中还可以使用 `_` 作为视觉分隔符,从而让数字更易于阅读,比如 `1_234_456_789_012`,这与指明 `123456789012` 有着同样的值。
*表 3-2:Rust 中的数字字面值*
@@ -83,19 +86,24 @@ error: could not compile `data_types` (bin "data_types") due to previous error
| 二进制(Binary) | `0b1111_0000` |
| 字节(仅限 `u8`,Byte(`u8` only)) | `b'A'` |
-那么怎样知道,该用何种类型的整数呢?在不确定的时候,一般来说 Rust 默认的整数类型,即是不错的开场:整数类型默认为 `i32`。而要用到 `isize` 或 `usize` 的主要场合,则是在对一些类别的集合进行索引的时候(the primary situation in which you'd use `isize` or `usize` is when indexing some sort of collection)。
+
+那么,咱们怎么知道,要使用哪种整数类型呢?在不确定时,Rust 默认选项,通常是个很好的开始:整数类型默认为 `i32`。而使用 `isize` 或 `usize` 的主要情况,是在索引某种集合时。
+
> 关于 **整数溢出**
>
-> 比方说有个类型为 `u8` 的、可保存 `0` 到 `255` 之间值的变量。在尝试将该变量修改为超出那个范围的某个值,比如 `256` 时,就会发生 *整型溢出(integer overflow)*,而整型溢出又可导致两种行为之一。在以调试模式进行程序编译时,Rust 就会包含整数溢出的检查,在发生了整数溢出时,就会导致程序进入 *错误(panic)* 状态。对于程序因错误而退出执行这种情况,Rust 使用了 猝死(paniking) 这个词语;在第 9 章中的 [带有 `panic!` 宏的不可恢复性错误](Ch09_Error_Handling.md#带-panic-的不可恢复错误) 小节,将更深入地讨论到程序因错误而终止运行的情况。
+> 假设咱们有个可保存 0 到 255 之间值的 `u8` 类型变量。在咱们尝试将该变量,更改为超出该范围的某个值,比如 256 时,就会发生 *整数溢出,integer overflow*,这可能导致两种行为之一。在咱们以调试模式编译时,Rust 包含了对那些发生时,会引起咱们程序 *中止,panic* 的整数溢出的检查。当某个程序以一个报错而退出时,Rust 便对此使用 *中止,panicking* 一词;我们将在第 9 章,[“使用 `panic!` 的无法恢复错误](../error_handling/panic.md) 小节中,更深入地讨论中止运行。
>
-> 在以 `--release` 开关进行发布模式的编译时,Rust 就不会包含对引起程序终止运行的整数溢出的检查。这时若发生了溢出,Rust 就会执行 *二进制补码封装(two's complement wrapping)*。简而言之,对于比那种类型能保存的最大值还要大的值,就会被“回卷(wrap around)”到那种类型所能保存的最小值。以 `u8` 为例,值 `256` 就变成了 `0`,值 `257` 就变成了 `1`,如此等等。这样程序就不会死掉,而那个变量则会有着一个或许不是所期望的值。对整数溢出的回卷行为的依赖,被视为一种错误(Relying on integer overflow's wrapping behavior is considered an error)。
+> 而使用 `--release` 命令行开关,在发布模式下编译时,Rust 就不会检查会导致中止运行的整数溢出。相反,如果发生溢出,Rust 会执行 *二的补码换行,two's complement wrapping*。简而言之,大于该类型所能容纳最大值的值,会 “折回,wrap around” 到该类型所能容纳的最小值。在 `u8` 的情况下,值 256 会变成 0,值 257 会变成 1,依此类推。程序不会中止运行,但变量的值可能不是咱们期望的值。依赖整数溢出的 wrapping 行为,被视为错误。
>
-> 要显式地处理可能的溢出,就要用到标准库为原生数字类型所提供的以下方法族(these families of methods provided by the standard library for primitive numeric types):
+> 要显式地处理溢出的可能性,咱们可以使用标准库为原始数值类型,所提供的下面这一系列方法:
>
> - 以 `wrapping_*` 这些方法的所有模式的封装,比如 `wrapping_add`(wrap in all modes with the `wrapping_*` methods, such as `wrapping_add`);
+>
> - 存在以 `checked_*` 方法的溢出时,返回 `None` 值(return the `None` value if there is overflow with the `checked_*` methods);
+>
> - 返回该值,以及一个表示是否存在带有 `overflowing_*` 方法的溢出的布尔值(return the value and a boolean indicating whether there was overflow with the `overflow_*` methods);
+>
> - 以 `saturating_*` 方法,实现该值的最小或最大值处饱和(saturate at the value's minimum or maximum values with `saturating_*` methods)。