更改了移位运算符中较有误导性的描述 (#354)

* 更改了移位运算符中较有误导性的描述

“仅使用右侧的5 个低阶位” 中的“右侧”之前主语不明确,容易引起歧义。改为“仅使用右值的5 个低阶位” 则明确表示为等号右侧值的5个低阶位,使语义更清晰。

* 翻译勘误

”数字的二进制表示称为有符号的两个补数。“这句的原文为“The binary representation of the numbers is referred to as signed twos complement”。这里的“2's complement” 为计算机术语“补码”,所以这句话应翻译为“数字的二进制表示形式是带符号的补码”。
This commit is contained in:
LeonTheProfessional
2020-01-17 14:31:49 +08:00
committed by Joe
parent 15c089fc5a
commit 9fd1aa7079

View File

@@ -654,7 +654,7 @@ float f4 = 1e-43f; //10 的幂数
移位运算符面向的运算对象也是二进制的“位”。它们只能用于处理整数类型(基本类型的一种)。左移位运算符 `<<` 能将其左边的运算对象向左移动右侧指定的位数(在低位补 0。右移位运算符 `>>` 则相反。右移位运算符有“正”、“负”值:若值为正,则在高位插入 0若值为负则在高位插入 1。Java 也添加了一种“不分正负”的右移位运算符(>>>它使用了“零扩展”zero extension无论正负都在高位插入 0。这一运算符是 C/C++ 没有的。
如果移动 **char**、**byte** 或 **short**,则会在移动发生之前将其提升为 **int**,结果为 **int**。仅使用右的 5 个低阶位。这可以防止我们移动超过 **int** 范围的位数。若对一个 **long** 值进行处理,最后得到的结果也是 **long**。
如果移动 **char**、**byte** 或 **short**,则会在移动发生之前将其提升为 **int**,结果为 **int**。仅使用右rvalue的 5 个低阶位。这可以防止我们移动超过 **int** 范围的位数。若对一个 **long** 值进行处理,最后得到的结果也是 **long**。
移位可以与等号 `<<=` 或 `>>=` 或 `>>>=` 组合使用。左值被替换为其移位运算后的值。但是,问题来了,当无符号右移与赋值相结合时,若将其与 **byte** 或 **short** 一起使用的话,则结果错误。取而代之的是,它们被提升为 **int** 型并右移,但在重新赋值时被截断。在这种情况下,结果为 -1。下面是代码示例
@@ -805,7 +805,7 @@ i >>> 5, int: 97591828, binary:
...
```
结尾的两个方法 `printBinaryInt()` 和 `printBinaryLong()` 分别操作一个 **int** 和 **long** 值,并转换为二进制格式输出,同时附有简要的文字说明。除了演示 **int** 和 **long** 的所有位运算符的效果之外,本示例还显示 **int** 和 **long** 的最小值、最大值、+1 和 -1 值以便我们了解它们的形式。注意高位代表符号0 表示正1 表示负。上面显示了 **int** 部分的输出。数字的二进制表示称为有符号的两个补数
结尾的两个方法 `printBinaryInt()` 和 `printBinaryLong()` 分别操作一个 **int** 和 **long** 值,并转换为二进制格式输出,同时附有简要的文字说明。除了演示 **int** 和 **long** 的所有位运算符的效果之外,本示例还显示 **int** 和 **long** 的最小值、最大值、+1 和 -1 值以便我们了解它们的形式。注意高位代表符号0 表示正1 表示负。上面显示了 **int** 部分的输出。以上数字的二进制表示形式是带符号的补码2's complement
<!-- Ternary-if-else-Operator -->
## 三元运算符