在JavaScript 中,所有整數變數預設都是有符號整數,這又代表什麼呢?
有符號整數使用31 位元表示整數的數值,用第32 位元表示整數的符號,0 表示正數,1 表示負數。
數值範圍從-2^31 - 2^31-1 即-2147483648 到2147483647。
JavaScript 進行位元操作時,是採用32位元有符號整數,這表示其轉換的結果也是32位元有符號整數。 有些時候,我們進行移位會出現意想不到的結果,以下是C語言與JS 的比較。
C語言
複製代碼代碼如下:
unsigned int a = 3774191835u;
unsigned int b = a >> 2;
/* b == 943547958 */
JavaScript
複製代碼代碼如下:
var a = 3774191835;
var b = a >> 2;
/* b == -130193866 */
可以看到,JavaScript 進行位元運算時,是採用的有符號整型,故我們得到了不同的結果。 怎麼解決呢?
我們可以把JavaScript 中的符號數,轉換成無符號數。只需要進行>>>0 移位操作就好了。
最好不要使用>> ,建議使用>>> 因為最左邊一位會被解析成符號位,當數字溢位時,會被解析成負數。