如何理解有符號數和無符號數

2021-06-27 02:48:22 字數 3316 閱讀 1676

這一點,你可能聽過兩種不同的回答。

一種是教科書,它會告訴你:計算機用「補碼」表示負數。可是有關「補碼」的概念一說就得一節課,這一些我們需要在第6章中用一章的篇幅講2進製的一切。再者,用「補碼」表示負數,其實一種公式,公式的作用在於告訴你,想得問題的答案,應該如何計算。卻並沒有告訴你為什麼用這個公式就可以和答案?

另一種是一些程式設計師告訴你的:用二進位制數的最高位表示符號,最高位是0,表示正數,最高位是1,表示負數。這種說法本身沒錯,可是如果沒有下文,那麼它就是錯的。至少它不能解釋,為什麼字元型別的-1用二進位制表示是「1111 1111」(16進製為ff);而不是我們更能理解的「1000 0001」。(為什麼說後者更好理解呢?因為既然說最高位是1時表示負數,那1000 0001不是正好是-1嗎?)。

讓我們從頭說起。

1. 你自已決定是否需要有正負

就像我們必須決定某個量使用整數還是實數,使用多大的範圍數一樣,我們必須自已決定某個量是否需要正負。如果這個量不會有負值,那麼我們可以定它為帶正負的型別。

在計算機中,可以區分正負的型別,稱為有符型別,無正負的型別(只有正值),稱為無符型別。

數值型別分為整型或實型,其中整型又分為無符型別或有符型別,而實型則只有符型別。

字元型別也分為有符和無符型別。

比如有兩個量,年齡和庫存,我們可以定前者為無符的字元型別,後者定為有符的整數型別。

2. 使用二制數中的最高位表示正負

首先得知道最高位是哪一位?1個位元組的型別,如字元型別,最高位是第7位,2個位元組的數,最高位是第15位,4個位元組的數,最高位是第31位。不同長度的數值型別,其最高位也就不同,但總是最左邊的那位(如下示意)。字元型別固定是1個位元組,所以最高位總是第7位。

(紅色為最高位) 單位元組數: 1(紅色為最高位) 單位元組數: 1111 1111

雙位元組數: 1111 1111 1111 1111

四位元組數: 1111 1111 1111 1111 1111 1111 1111 1111

當我們指定乙個數量是無符號型別時,那麼其最高位的1或0,和其它位一樣,用來表示該數的大小。

當我們指定乙個數量是無符號型別時,此時,最高數稱為「符號位」。為1時,表示該數為負值,為0時表示為正值。 

3. 無符號數和有符號數的範圍區別

無符號數中,所有的位都用於直接表示該值的大小。有符號數中最高位用於表示正負,所以,當為正值時,該數的最大值就會變小。我們舉乙個位元組的數值對比: 無符號數: 1111 1111   值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

有符號數: 0111 1111   值:127         1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20  

同樣是乙個位元組,無符號數的最大值是255,而有符號數的最大值是127。原因是有符號數中的最高位被挪去表示符號了。並且,我們知道,最高位的權值也是最高的(對於1位元組數來說是2的7次方=128),所以僅僅少於一位,最大值一下子減半。

不過,有符號數的長處是它可以表示負數。因此,雖然它的在最大值縮水了,卻在負值的方向出現了伸展。我們仍乙個位元組的數值對比:

無符號數:                       0 ----------------- 255

有符號數:        -128 --------- 0 ---------- 127  

同樣是乙個位元組,無符號的最小值是 0 ,而有符號數的最小值是-128。所以二者能表達的不同的數值的個數都一樣是256個。只不過前者表達的是0到255這256個數,後者表達的是-128到+127這256個數。

有符號的資料型別的最大值的計算方法完全和無符號一樣,只不過它少了乙個最高位(見第3點)。但在負值範圍內,數值的計算方法不能直接使用1* 26 + 1* 25 的公式進行轉換。在計算機中,負數除為最高位為1以外,還採用補碼形式進行表達。所以在計算其值前,需要對補碼進行還原。這些內容我們將在第六章中的二進位制知識中統一學習。

這裡,先直觀地看一眼補碼的形式:

以我們原有的數學經驗,在10進製中:1 表示正1,而加上負號:-1 表示和1相對的負值。

那麼,我們會很容易認為在2進製中(1個位元組): 0000 0001 表示正1,則高位為1後:1000 0001應該表示-1。

然而,事實上計算機中的規定有些相反,請看下表:

二進位制值(1位元組)

十進位制值

1000 0000

-128

1000 0001

-127

1000 0001

-126

1000 0011

-125

......

1111 1110

-21111 1111-1

首先我們看到,從-1到-128,其二進位制的最高位都是1(表中標為紅色),正如我們前面的學。

然後我們有些奇怪地發現,1000 0000 並沒有拿來表示 -0;而1000 0001也不是拿來直觀地表示-1。事實上,-1 用1111 1111來表示。 怎麼理解這個問題呢?先得問一句是-1大還是-128大?

當然是 -1 大。-1是最大的負整數。以此對應,計算機中無論是字元型別,或者是整數型別,也無論這個整數是幾個位元組。它都用全1來表示 -1。比如乙個位元組的數值中:1111 1111表示-1,那麼,1111 1111 - 1 是什麼呢?和現實中的計算結果完全一致。1111 1111 - 1 = 1111 1110,而1111 1110就是-2。這樣一直減下去,當減到只剩最高位用於表示符號的1以外,其它低位全為0時,就是最小的負值了,在一位元組中,最小的負值是1000 0000,也就是-128。 我們以-1為例,來看看不同位元組數的整數中,如何表達-1這個數:

位元組數二進位制值

十進位制值

單位元組數

1111 1111

-1雙位元組數

1111 1111 1111 1111

-1四位元組數

1111 1111 1111 1111 1111 1111 1111 1111-1

可能有同學這時會混了:為什麼 1111 1111 有時表示255,有時又表示-1?所以我再強調一下本節前面所說的第2點:你自已決定乙個數是有符號還是無符號的。寫程式時,指定乙個量是有符號的,那麼當這個量的二進位制各位上都是1時,它表示的數就是-1;相反,如果事選宣告這個量是無符號的,此時它表示的就是該量允許的最大值,對於乙個位元組的數來說,最大值就是255。



有符號數和無符號數

有符號和無符號整數 1.通常情況下,大多數字預設的是有符號數,比如 4,5 要想寫乙個無符號數必須在後面加u 比如 4u,5u 2.在計算機中有符號數是用補碼的形式來表示的,最高位是符號位。無符號數就是正數唄 正數的補碼和原碼相同。比如 1 在計算機中表示為 11111111 11111111 11...

無符號數和有符號數

人有十個手指頭,習慣了逢十進一,於是十進位製成了生活中的標準。程式的世界只有高低電平兩種狀態,更適合用二進位制來表示,於是二進位製成了程式世界的標準。對與無符號數來說,我們更喜歡談他們之間的轉化,十進位制是我們最習慣的進製,於是十進位制轉為r進製,r進製轉為十進位制變尤為重要。十進位制 r進製 整數...

有符號數和無符號數

刷題刷到了有符號數的問題,回顧一下知識點 有符號數 signed 可以區分正負數 最高位表示數值的正負 0表示正數,1表示負數 無符號數 unsigned 不區分正負數 只有整數型別 雖然無符號數所能表示的最大數值大於有符號數,但兩者所能表示的數值範圍相同。eg.short int 128,0 0,...