1、引用
ECMAScript 整數有兩種類型,即有符號整數(允許用正數和負數)和無符號整數(只允許用正數)。在 ECMAScript 中,所有整數字面量默認都是有符號整數,這意味着什麼呢?
有符號整數使用 31 位表示整數的數值,用第 32 位表示整數的符號,0 表示正數,1 表示負數。數值範圍從 -2147483648 到 2147483647。-2147483648是補碼10000000000000000000000,即-0
二進制使用有符號整數保存數據
負數也存儲爲二進制代碼,不過採用的形式是二進制補碼。計算數字二進制補碼的步驟有三步:
- 確定該數字的非負版本的二進制表示(例如,要計算 -18的二進制補碼,首先要確定 18 的二進制表示)
- 求得二進制反碼,即要把 0 替換爲 1,把 1 替換爲 0
- 在二進制反碼上加 1
要確定 -18 的二進制表示,首先必須得到 18 的二進制表示,如下所示:
0000 0000 0000 0000 0000 0000 0001 0010
接下來,計算二進制反碼,如下所示:
1111 1111 1111 1111 1111 1111 1110 1101
最後,在二進制反碼上加 1,如下所示:
1111 1111 1111 1111 1111 1111 1110 1101
1
---------------------------------------
1111 1111 1111 1111 1111 1111 1110 1110
因此,-18 的二進制表示即 1111 1111 1111 1111 1111 1111 1110 1110。記住,在處理有符號整數時,開發者不能訪問 31 位。
有趣的是,把負整數轉換成二進制字符串後,ECMAScript 並不以二進制補碼的形式顯示,而是用數字絕對值的標準二進制代碼前面加負號的形式輸出。例如:
var iNum = -18;
alert(iNum.toString(2)); //輸出 "-10010"
這段代碼輸出的是 "-10010",而非二進制補碼,這是爲避免訪問位 31。爲了簡便,ECMAScript 用一種簡單的方式處理整數,使得開發者不必關心它們的用法。
2、含義
運算符 | 名稱 | 描述 |
---|---|---|
& | AND | 如果兩位都是 1 則設置每位爲 1 |
| | OR | 如果兩位之一爲 1 則設置每位爲 1 |
^ | XOR | 如果兩位只有一位爲 1 則設置每位爲 1 |
~ | NOT | 反轉所有位 |
<< | 零填充左位移 | 通過從右推入零向左位移,並使最左邊的位脫落。 |
>> | 有符號右位移 | 通過從左推入最左位的拷貝來向右位移,並使最右邊的位脫落。 |
>>> | 零填充右位移 | 通過從左推入零來向右位移,並使最右邊的位脫落。 |
3、需要注意的地方
- 當數值不在-2147483648 到 2147483647區間時,會溢出覆蓋符號位
- 對負數進行操作是,需先轉成補碼;比如:~-1,-1補碼等於:32個1
- 符號位是1的代表着補碼,轉成二進制數的方法:減1,再取反,加上負號;