計算機中的有符號數和無符號數

2021-07-05 02:24:05 字數 4580 閱讀 5525

1.概念

在計算機中,可以區分正負型別的數,成為「有符號數」(signed);無正負型別的數(只有整數型別),成為「無符號數」(unsigned)。簡明的說,無符號說就是其所有的位數都用來表示數值的大小,有符號數除最高位來表示數值的正負外(0表示正數;1表示負數),其餘各位用來表示數值的大小。舉個例子說明一下:十機制數 正數255  二進位制表達形式:1111 1111

十機制數 負數-1     二進位制表達形式:1111 1111 

可見-1的二進位制的最高位為紅色的1,可是為什麼其表達形式為1111 1111而不是1000 0001呢?這就關於任何數在計算機內是以補碼形式儲存問題。下面會介紹的,在此先不詳細說明了。

2.儲存範圍

從前面的介紹可以知道,由於有符號數的最高位被拿來用作符號位,所以它所能夠表達的最大數值要小於無符號數所能夠表達的最大數值。還是舉個例子來說明一下吧:

無符號數:1111 1111 十進位制值:255

有符號數:0111 1111 十進位制值:127

這是有人可能會提出這樣的疑問:有符號數所能夠表達的數值範圍會不會小於無符號數所能夠表達的數值範圍呢?

呵呵,答案是否定的!雖然有符號數在表達最大值上的能力減弱了,但是它能夠表達負數。負數的個數可以彌補其不足。來讓我們比較一下:

乙個位元組的無符號數的表達數值範圍是:[0,255]

乙個位元組的有符號數的表達數值範圍是:[-128,0),[0,127]

可見它們都能夠表示256個數。

3.各種碼(原碼/反碼/補碼)

有些人也許會這樣認為"-1"(雙位元組)在計算機中的表達形式為1000 0000 0000 0001,可是實際上不是的。計算機是以其補碼的形式進行表達的,即「-1」(雙位元組)的表達形式是1111 1111 1111 1111。

說一下各種碼的概念吧。

原碼:乙個整數,按照絕對值的大小轉換成二進位制數,最高位為符號位。

反碼:將原碼除最高位(符號位)外,其餘各位按位取反,所得到的二進位製碼。正數的反碼為原碼。

補碼:反碼最低位加1即為補碼。

關於負數的補碼求法說明一下,先得到其反碼,之後將反碼加1即可。有些大神根據其原碼,閉眼即得,這種能力需要修煉一下啊。

這時有些人可能會說,為什麼要引入補碼的形式呢?直接按照原碼儲存不就省事很多嗎?嘿嘿,要記住,有些事情並不是你想省事就能省事的。好了來欣賞一下補碼的優勢吧。

計算機的帶符號數用補碼表示的優點:

1負數的補碼與對應正數的補碼之間的轉換可以用同一種方法-求補運算完成,可以簡化硬體。 2 可將減法變為加法,這樣減法就可以用加法器進行計算了。 3 兩個用補碼表示的數相加時,如果最高位(符號位)有進製,則進製被捨棄。

心算求補(大神求補演算法):

從最低位開始至找到的第乙個1均不變,符號位不變,這之間的各位「求反」(0變1;1變0)。

原碼:1010 1001  補碼:1101 0111.

4.有符號數與無符號數的相互轉換

無符號整數和有符號整數之間進行強制型別轉換時,位模式不改變。

有符號數轉換為無符號數時,負數轉換為大的正數,相當於在原值上加上2的n次方,而正數保持不變。

無符號數轉換為有符號數時,對於小的數將保持原值,對於大的數將轉換為負數,相當於原值減去2的n次方。

當表示式中存在有符號數和無符號數型別時,所有的操作都自動轉換為無符號型別。可見無符號數的運算優先順序高於有符號數。

unsigned

inta =20

;signed

intb =-

130;

運算一下結果是 b>a 。

5.轉換大餐

有符號數的轉換

原型別目標型別

轉換方法

char

short

符號位擴充套件

char

long

符號位擴充套件

char

unsigned char

最高符號位失去位意義,變為資料位

char

unsigned short

符號位擴充套件到short;然後從short轉到unsigned short

char

unsigned long

符號位擴充套件到long;然後從long轉換到unsigned long

char

float

符號位擴充套件到long;然後從long轉到float

char

double

符號位擴充套件到long;然後從long轉換到double

char

long double

符號位擴充套件到long;然後從long轉換到long double

short

char

保留低位位元組

short

long

符號位擴充套件

short

unsigned char

保留低位位元組

short

unsigned short

最高為失去意義,變為資料位

short

unsigned long

符號位擴充套件到long;然後從long轉到unsigned long

short

float

符號位擴充套件到long;然後從long轉到float

short

double

符號位擴充套件到long;然後從long轉到double

short

long double

符號位擴充套件到long;然後從long轉換到long double

long

char

保留低位位元組

long

short

保留低位位元組

long

unsigned char

保留低位位元組

long

unsigned short

保留低位位元組

long

unsigned long

最高為失去意義,變為資料位

long

float

使用單精度浮點數表示,可能失去精度

long

double

使用單精度浮點數表示,可能失去精度

long

long double

使用單精度浮點數表示,可能失去精度

無符號數的轉換

原型別目標型別

轉換方法

unsigned char

char

最高為作符號位

unsigned char

short

0擴充套件unsigned char

long

0擴充套件unsigned char

unsigned short

0擴充套件unsigned char

unsigned long

0擴充套件unsigned char

float

轉換到long;然後從long轉換到float

unsigned char

double

轉換到long;然後從long轉換到double

unsigned char

long double

轉換到long;然後從long轉換到long double

unsigned short

char

保留低位位元組

unsigned short

short

最高為作符號位

unsigned short

long

0擴充套件unsigned short

unsigned char

保留低位位元組

unsigned short

unsigned long

0擴充套件unsigned short

float

轉換到long;然後從long轉換到float

unsigned short

double

轉換到long;然後從long轉換到double

unsigned long

long double

轉換到long;然後從long轉換到long double

unsigned long

char

保留低位位元組

unsigned long

short

保留低位位元組

unsigned long

long

最高位作符號位

unsigned long

unsigned char

保留低位位元組

unsigned long

unsigned short

保留低位位元組

unsigned long

float

轉換到long;然後從long轉換到float

unsigned long

double

直接轉換到double

unsigned long

long double

轉換到long;然後從long轉換到long double

有符號數和無符號數在計算機中怎麼區分?

確如題主所說,計算機中儲存的任何資料都是二進位制形式,單看資料是無法認定其格式和內容的。計算機要用二進位制編碼來表達數值的符號,最直觀的方法就是符號位。但為了保證基本算術運算在正負數上的一致性,x86計算機對負數採用了特殊的編碼方式,即補碼。為什麼補碼這麼巧妙實現了正負數的加減運算?參見維基百科 補...

有符號數和無符號數

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

無符號數和有符號數

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