1 回答

TA貢獻1862條經驗 獲得超7個贊
因為 ~8 恰好是 -9 在計算機中的表示方式。。。。
32位無符號整數可以表示 0 ~ 2^32-1
的正整數范圍,這樣可以表示2^32
個整數。
當作為有符號數的時候,不是把最高的比特位作為符號位,即 -1
不是直接把000..001
的最高bit置為 1 ,而是使用其 -1 + 2^32
= 2^32-1
對應的二進制數表示。這種形式叫做補碼。一種最快的求負數補碼的方式是,其絕對值的二進制,從低位開始,遇到的第一個 1 之前(包括這個1)不變,其他的 1 變 0, 0 變 1。 比如 -4 的補碼是, 4 -> 00...0100
-> 11...1100
這樣做的好處是,減少運算規則,對于加法和減法,計算機不必區分是不是有符號的。比如 4 位的整形。 有符號的-5 + 4 = -1
二進制表示是 1011 + 0100 = 1111
,而無符號的11+4=15
二進制形式也是1011 + 0100 = 1111
。如果用1101
表示-5
那么有符號加法就是1101 + 0100 = 1111
,這樣,人看起來不方便,計算機也不方便。
你說的對,去反就是最大的值-當前的值
這是對于無符號整數來說的。 只是除了>>>
之外,JS 位操作符的返回值,是有符號型的32位整數。
function toUint32(x) {return x>>>0;}
function toInt32(x) { return x>>0;}
MaxUint32 = toUint32(-1);// -1 的二進制表示和 2^32 - 1 一樣(32位整形來說)
console.log(MaxUint32) // 4294967295
console.log(8 + toUint32(~8) === MaxUint32) // true
console.log(7 + toUint32(~7) === MaxUint32) // true
// 下面幾個與本問題無關,就當是擴展了,自己試試輸出是什么。
console.log(MaxUint32 + 1)
console.log(toUint32(MaxUint32+1))
console.log(toUint32(MaxUint32+2))
添加回答
舉報