2010-07-03 52 views
0

如果在我的編譯器中,int是16位的,那麼它的範圍是-32768到32767(在2的補碼機器中)。
我想知道爲什麼負數有1個額外的號碼。即正數爲32767 ,但負數爲32768。爲何偏向負數?

-32768如何用2的補碼m/c表示?

回答

6

在16位上,可以將pow(2,16)(2代表第十六次冪)的不同組合代表65536個數字。這是決定零看起來最好本地表示爲000 ... 000,並且「二補」系統中的正數通常是可讀的(它們相當於所謂的「自然二進制」表示,如0000 0000 0000 0101 = 5十進制等) 。

二進制補碼中的負數以1111 1111 1111 1111開始,代表-1。把它想象成一個數字爲997,998,999的計數器撥號盤,突然當它代表1000時它溢出並顯示000.原理在這裏是一樣的,但是方向是相反的 - 從... 000 ... 111。 -2表示爲1111 .... 1110等等。

兩個補碼中可能出現的最小數字在前面有1個,其餘數字爲零。

+0

因此,在2的補碼中,是否爲符號保留了一位? 我以爲它只保留在符號幅度表示 – 2010-07-03 09:00:02

+0

不,沒有保留。最左邊的位實際上保存了值,如果它被設置爲0,則爲0;如果設置爲1,則保留值爲-32768。它可以用於檢查該數目是正數還是負數(完全像符號數量級),但編譯器會處理它適合你當你使用簽名/無符號整數。如果你對它更感興趣,你可以閱讀關於「符號擴展」......這是一個非常有趣的技巧,在8位整數「-1」是「1111 1111」,16位是「1111 1111 1111 1111」 (相同的大多數左邊標誌無關緊要,非常像「0000 0101」=「101」= 5)。 – eyescream 2010-07-03 11:28:07

1

沒有任何「偏向」。當最高有效位被設置時,該數字爲負數。爲「正數空間」(即,MSB是集),以及1-32767,必須爲零,因此明顯缺乏32768

-32768將由0b1000000000000000來表示。請參閱link text

3

如果你正在尋找一個簡單的,腳踏實地的答案:

沒有任何偏見。正數和負數有相同數量的數字,正數從0開始,從-1開始負數,因此是1的差值。 :)

1

沒有負零。 (-0)。這就是爲什麼它似乎是一種偏見。如果最後一位被設置,真的被認爲是否定的。在一個字節中還有另外7位可以在正範圍和負範圍內設置。

1

另一種考慮它的方法是創建一個1位帶符號的變量。簽名意味着必須有負數,當然會有正數。所以你可以有1個積極的一個否定的,你有什麼兩個數字?現在可以讓它變成2位,你有什麼2個正面和負面的照片?真正的祕密是最後一點代表負面。

Theres extra work,if we want to consider 0 a negative number。並且如果有負數將是浪費的。