慕瓜9086354
Java整數為32位,并且總是帶符號的。這意味著,最高有效位(MSB)用作符號位。用an表示的整數int不過是位的加權和。權重分配如下:Bit#? ? Weight31? ? ? -2^3130? ? ? ?2^3029? ? ? ?2^29...? ? ? ...2? ? ? ? 2^21? ? ? ? 2^10? ? ? ? 2^0請注意,MSB的權數為負(實際上最大可能為負),因此,當該位打開時,整數(加權和)將為負。讓我們用4位數字對其進行仿真:Binary? ? Weighted sum? ? ? ? ? ? Integer value0000? ? ? ?0 + 0 + 0 + 0? ? ? ? ? ?00001? ? ? ?0 + 0 + 0 + 2^0? ? ? ? ?10010? ? ? ?0 + 0 + 2^1 + 0? ? ? ? ?20011? ? ? ?0 + 0 + 2^1 + 2^0? ? ? ?30100? ? ? ?0 + 2^2 + 0 + 0? ? ? ? ?40101? ? ? ?0 + 2^2 + 0 + 2^0? ? ? ?50110? ? ? ?0 + 2^2 + 2^1 + 0? ? ? ?60111? ? ? ?0 + 2^2 + 2^1 + 2^0? ? ?7 -> the most positive value1000? ? ? -2^3 + 0 + 0 + 0? ? ? ? -8 -> the most negative value1001? ? ? -2^3 + 0 + 0 + 2^0? ? ? -71010? ? ? -2^3 + 0 + 2^1 + 0? ? ? -61011? ? ? -2^3 + 0 + 2^1 + 2^0? ? -51100? ? ? -2^3 + 2^2 + 0 + 0? ? ? -41101? ? ? -2^3 + 2^2 + 0 + 2^0? ? -31110? ? ? -2^3 + 2^2 + 2^1 + 0? ? -21111? ? ? -2^3 + 2^2 + 2^1 + 2^0? -1因此,二進制補碼不是表示負整數的排他方案,而是可以說整數的二進制表示始終相同,我們只是忽略了最高有效位的權重。該位確定整數的符號。在C中,有一個關鍵字unsigned(在Java中不可用),可用于聲明unsigned int x;。在無符號整數中,MSB的權重為正(2^31),而不為負。在這種情況下,an的范圍unsigned int是0to 2^32 - 1,而an的int范圍是-2^31to 2^31 - 1。從另一個角度來看,如果您考慮xas 的二的補碼~x + 1(NOT x加一),則說明如下:對于任何x,~x都只是的按位倒數x,因此,凡是x帶有1-bit的位置,~x都將帶有0-bit的位置(反之亦然)。因此,如果將它們加起來,則加法運算中將不會有進位,并且總和將只是一個整數,其每一位均為1。對于32位整數:x + ~x = 1111 1111 1111 1111 1111 1111 1111 1111x + ~x + 1 =? ?1111 1111 1111 1111 1111 1111 1111 1111 + 1? ? ? ? ? ?= 1 0000 0000 0000 0000 0000 0000 0000 0000最左邊的1位將被丟棄,因為它不適合32位(整數溢出)。所以,x + ~x + 1 = 0-x = ~x + 1因此,您可以看到負數x可以由表示~x + 1,我們稱它們為的補數x。