計算機中數據的編碼方式


一.整數的表示

由於計算機只能識別二進制的0和1,在存儲數據時就涉及到了對數據的編碼問題,計算機中對整數的編碼有兩種不同的方式,分別為:
1. 只能表示非負數,此種類型數據稱為無符號類型 即 unsigned 
2. 能表示負數0和正數,此種類型數據稱為有符號類型 signed

二.整型數據類型的表示范圍

C語言支持多種整型數據類型--表示有限范圍的整數,

32位環境整型數據的取值范圍:

C數據類型

字節數

編碼方式

能表示的最小值

能表示的最大值

unsigned char

1

原碼

0 (0x00)

128 (0xFF)

char

1

補碼

-128 (0x80 )

127 (0x7F)

unsigned short

2

原碼

0 (0x00 00)

65535(0xFFFF)

short

2

補碼

-32768(0x8000)

32767(0x7FFF)

unsigned int

4

原碼

(0x0000 0000)

(0xFFFF FFFF)

int

4

補碼

(0x8000 0000)

(0x7FFF FFFF)

unsigned long

4

原碼

(0x0000 0000)

(0xFFFF FFFF)

long

4

補碼

(0x8000 0000)

(0x7FFF FFFF)

unsigned long long

8

原碼

(0x0000 0000 0000 0000)

(0xFFFF FFFF FFFF )

long long

8

補碼

(0x8000 0000 0000 0000 )

(0x7FFF FFFF FFFF FFFF)

 32位環境的驗證:

sizeof(char) = 1byte
sizeof(unsigned char) = 1byte
sizeof(short int) = 2byte
sizeof(unsigned short int) = 2byte
sizeof(int) = 4byte
sizeof(unsigned int) = 4byte
sizeof(long) = 4byte
sizeof(unsigned long) = 4byte
sizeof(long long) = 8byte
sizeof(unsigned long long) = 8byte

64位環境整型數據的取值范圍: 


C數據類型

字節數

編碼方式

能表示的最小值

能表示的最大值

unsigned char

1

原碼

0 (0x00)

128 (0xFF)

char

1

補碼

-128 (0x80 )

127 (0x7F)

unsigned short

2

原碼

0 (0x00 00)

65535(0xFFFF)

short

2

補碼

-32768(0x8000)

32767(0x7FFF)

unsigned int

4

原碼

(0x0000 0000)

(0xFFFF FFFF)

int

4

補碼

(0x8000 0000)

(0x7FFF FFFF)

unsigned long

8

原碼

(0x0000 0000 0000 0000)

(0xFFFF FFFF FFFF )

long

8

補碼

(0x8000 0000 0000 0000 )

(0x7FFF FFFF FFFF FFFF)

unsigned long long

8

原碼

(0x0000 0000 0000 0000)

(0xFFFF FFFF FFFF )

long long

8

補碼

(0x8000 0000 0000 0000 )

(0x7FFF FFFF FFFF FFFF)



64位環境的驗證;

sizeof(char) = 1

sizeof(unsigned char) = 1

sizeof(short int) = 2

sizeof(unsigned short int) = 2

sizeof(int) = 4

sizeof(unsigned int) = 4

sizeof(long) = 8

sizeof(unsigned long) = 8

sizeof(long long) = 8

sizeof(unsigned long long) = 8


三.無符號數的編碼

計算機對無符號數的編碼方式采用原碼的形式,假設一個整數數據類型有 w 位。我們可以將位向量寫成 x→,表示整個向量,或者寫成 [xw-1 ,xw-2,…,x0],表示向量中的每一位。把 x→看做一個二進制表示的數,就獲得了 x→的無符號表示。可以用一個函數 B2Uw(Binary to Unsigned)的縮寫,長度為 w)來表示 :

 函數B2Uw將一個長度為w的0,1串映射到一個非負數,具體的示例如下:

B2U4([0001]) = 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 0 + 0 + 0 + 1 = 1
B2U4([0101]) = 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 0 + 4 + 0 + 1 = 5
B2U4([1011]) = 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 = 8 + 0 + 2 + 1 = 11
B2U4([1111]) = 1 * 2^3 + 1 * 2^2 + 1 * 2^1 + 1 * 2^0 = 8 + 4 + 2 + 1 = 15
無符號編碼方式下w位可表示的范圍:
最下值:[000......0] = 0
最大值:[111......1] = 2^w - 1;
總結:一個w位的二進制可表示的無符號類型整數的范圍是0 — 2^w -1;

四. 有符號整數的編碼
實際的應用中,會需要負數的值,最常用的有符號數的編碼方式為補碼編碼,在這個定義中,將字的最高有效位解釋為負權(negative weight)。我們用函數 B2Tw(Binary to Two’s-complement 的縮寫,長度為 w)來表示

最高有效位 xw-1 也稱為符號位,它的“權重”為 -2^(w-1),是無符號表示中權重的負數。符號位被設置為 1 時,表示值為負,而當設置為 0 時,值為非負.具體的編碼示例如下:

B2T4( [0001] ) =0* 2^3 + 0 *2^2 + 0 *2^1 +1* 2^0 = 0 + 0 + 0 + 1 = 1
B2T4( [0101] ) =0 * 2^3 +1 *2^2 + 0 *2^1 +1* 2^0 = 0 + 4 + 0 + 1 = 5
B2T4( [1011] ) =1 * 2^3 +0 *2^2 + 1 *2^1 +1* 2^0 = −8 + 0 + 2 + 1 = −5
B2T4( [1111] ) =1 * 2^3 +1 *2^2 + 1 *2^1 +1* 2^0 = −8 + 0 + 2 + 1 = −1

有符號編碼方式下w位可表示的范圍:
讓我們來考慮一下 w 位補碼所能表示的值的范圍。它能表示的最小值是位向量 [10…0](也就是設置這個位為負權,但是清除其他所有的位),其整數值為-2^(w-1),而最大值是位向量[01…1](清除具有負權的位,而設置其他所有的正權位)其整數值為2^(w-1);
所以范圍為:-2^(w-1) ——2^(w-1);



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM