2012-01-09 27 views

回答

8

如果你設置一個二進制補碼整數的所有位,那麼你得到-1。

讓我說明了(非常小的),二位有符號整數使用補:

00 → 0 
01 → 1 
10 → −2 
11 → −1 

這僅僅是從0開始計數了,過去的溢出從1到-2並且結束-1 。正如你所看到的,如果你清除所有的位,你得到0,如果你設置它們全部,你得到-1(不管整數有多寬)。

(請注意,使用基本的人都知道這已經,因爲沒有布爾運算符和工作的事情同樣出色位運算符,除了真正的是-1,而不是1)

+1

「使用BASIC的人」我正式太年輕,不能記住。 – BoltClock 2012-01-09 07:29:39

+1

至少在Visual Basic 6之前,就是這樣,如果我沒有記錯的話。 VB.NET引入了短路'AndAlso'和'OrElse'以及一個布爾類型。 – Joey 2012-01-09 07:41:11

5

即零實際上是由32個零比特表示,如PHP整數類型是32位有符號整數,而不是單位:

0000 0000 0000 0000 0000 0000 0000 0000 

所以按位非翻轉其中所有,導致-1的two's complement(與最左邊的一個代表符號):

1111 1111 1111 1111 1111 1111 1111 1111 
+4

如果你不明白爲什麼所有的位都是-1,那就問問自己:如果你給它加1,你會得到什麼?答案:溢出並且所有位都爲零。當你添加一個數字時,我們有一個給出零的數字的名稱... -1。 – 2012-01-09 07:22:40

+1

David,這對於二進制補碼是正確的,但對於符號位或補碼(至少不是天真的)不適用。從沒有親密認識電腦的人的角度來看,任何一種選擇都可以同樣解釋。 – Joey 2012-01-09 07:25:45

2

是它應該與2的補數系統,與設置的所有位的數量等於-1,自0擁有所有位取消設置,〜$ A將其所有的位設置。

因此,代碼的行爲如預期。

0

整數以2的讚美形式存儲。

此形式可以是輪廓廣告如下:

1)如果要存儲的數是正的值,則它的二進制值被存儲

例如 $ VAL = 5;

這裏$ VAL包含ordiary二進制equivlent 5 = 0101 //比特數取決於具體

2)如果你存儲負的數的說-5,然後存儲在二進制補碼小號

$val = -5; 

這裏先2的5恭維被發現即只需1的5 + 1

~ 0101 = 1010 

將TnEN的恭維加1

1010 + 
    1 
    ----- 
    1011 

並且這個1011被存儲在$ val中。

以相同的方式,$ val = 0; 00存儲

〜$ VAL => 11這是-2 2的恭維形式equalient

最後,如果你仔細觀察,你可能會問,

所以我怎麼能代表11 ?因爲它的二進制值是1011與2的comp中的-5值相沖突?

答案在於用來表示數字的位數。

2的complimwent形式

如果有N位,然後你可以從

-2^(n-1) to 2^(n-1) -1 ; 
相關問題