char 類型:在32位機器上佔1B,在64位機器上同樣佔1B;
註:char類型因儲存文本串中的單個字元而得名,所以無論在32為機器還是64為機器,都佔一個位元組。
取值範圍:0~255;
原因:由於char類型佔1B,而1B有8bit,所以其取值範圍為:00000000~11111111 (即:0~255)
對於整型,short至少為16bit,long至少為32bit。至於預設的int究竟是16bit還是32bit,或者是其他值,則由編譯器設計者決定。但需
注意:int類型的長度不能超過long類型。通常這個選擇的預設值是這種機器最為自然(高效)的位元。
int 類型:在32位機器上佔4B,在64位機器上同樣佔4B;
取值範圍:無符號(unsigned int):0~4294672295(2^32);
有符號(int):-2147483648~2147483647(2^31)
原因:由於int 類型佔4B,而4B有32bit,所以其取值範圍為:0~2^32,無符號類型同理。
short int 類型:在32位機器上佔2B,在64位機器上同樣佔2B;
取值範圍:無符號(unsigned short)0~65535(2^16);
有符號(short):-32768~32767(2^15)
原因:由於short int 類型佔2B,而2B有16bit,所以其取值範圍為:0~2^16,無符號類型同理。
long int 類型:在32位機器上佔4B,在64位機器上佔8B;
取值範圍:在32位機器上為:無符號(unsigned long)0~4294672296(2^32);
有符號(long):-2147483648~2147483647(2^31)
在64位機器上為:無符號(unsigned long)0~2^64;
有符號(long):2^63~2^63-1
原因:在32位機器上,由於long int 類型佔4B,而4B有32bit,所以其取值範圍為:0~2^32,無符號類型同理。
在64位機器上,由於long int 類型佔8B,而8B有64bit,所以其取值範圍為:0~2^64,無符號類型同理。
由於以上資料類型都是表示的都是整數,所以其處理過程都是相同的,而對於浮點型資料,電腦並不是按照處理整數的方式來處理的。
所以對於浮點型的資料,應另當別論。
現在的電腦系統基本上採用的都是IEEE浮點表示。所以我們先簡單瞭解一下IEEE浮點表示。
IEEE浮點標準用V = (-1)^s*M*2^E的形式來表示一個數:
符號(sign):s決定這個數是負數(s=1)還是正數(s=0),而對於數值0的符號位解釋作為特殊處理;
尾數(sifnficand):M是一個二進位小數,它的範圍是1~2-ε,或者0~1-ε;
階碼(exponent):E的作用是對浮點數加權,這個權重是2的E次冪(可能是負數)。
將浮點數的位表示劃分為三個欄位,分別對這些值進行編碼:
1. 一個單獨的符號位s直接編碼符號s;
2. k位階碼欄位exp編碼階碼E;
3. n位小數欄位frac編碼尾數M,但是編碼出來的值依賴於階碼欄位的值是否等於0;
在C語言中:單精確度浮點(float)格式中,s、exp、和frac欄位分別為1位,k=8位和n=23位,得到一個32位表示。
雙精確度浮點(double)格式中,s、exp、和frac欄位分別為1位,k=11位和n=52位,得到一個32位表示。
所以如果給定位表示,就可根據exp的值,將被編碼的值可以分成三種不同的情況:
1. 規格化的值:這是最普遍的情況。當exp的位元模式不全為0(數值為0),也不全為1(單精確度數值為255,雙精確度數值為2047)時,
都屬於這類情況。在這種情況中,階碼欄位被解釋為以偏置形式表示的有符號整數。也就是說,階碼的值是E=e-Bias,其中e是無
符號數,其位表示為ek-1…e1e0(註:i為下標),而Bias是一個等於2^(k-1)-1(單精確度為127,雙精確度是1023)的偏置值。
由此產生的指數的取值範圍為:
對於單精確度:-126~+127;(00000001-127 ~ 11111110-127)
對於雙精確度:-1022~+1023 (00000000001-1023 ~ 11111111110-1023)
註:由於exp的位元模式既不能全為0,也不能全為1,所以對於單精確度來說,e的範圍為00000001~11111110
對於雙精確度來說,e的範圍為00000000001~11111111110;
對於小數欄位frac的解釋為描述小數值f,其中0 <= f < 1,其二進位表示為0.f(n-1)…f1f0(n為下標),也就是二進位小數點的最高有效位
的左邊。尾數定義為M=1+f。
2.非規格化的值:當階碼域為全0時,所表示的數就是非規格化形式。在這種情況下,階碼值是E=1-Bias,而尾數值是M=f,也就是小數字
段的值。
3.特殊值:毫無疑問,只有階碼全為1這種情況了。當小數域全為0時,的到的值表示無窮,當s=0時,表示正無窮,當s=1時,表示負無窮。
float 類型:在32位機器上佔4B,在64位機器上同樣佔4B;
取值範圍:
對於規格化的值:-2^(127)*(1 + 2^(-1)+2^(-2)+……+2^(-23)) ~ 2^127*(1 + 2^(-1)+2^(-2)+……+2^(-23));
對於非規格化的值:-2^(-126)*(2^(-1)+2^(-2)+……+2^(-23)) ~ 2^(-126)*(2^(-1)+2^(-2)+……+2^(-23));
double 類型:在32位機器上佔8B,在64位機器上同樣佔8B;
取值範圍:
對於規格化的值:-2^(1023)*(1 + 2^(-1)+2^(-2)+……+2^(-52)) ~ 2^1023*(1 + 2^(-1)+2^(-2)+……+2^(-52));
對於非規格化的值:-2^(-1023)*(2^(-1)+2^(-2)+……+2^(-52)) ~ 2^(-1023)*(2^(-1)+2^(-2)+……+2^(-52));
在這裡順便提一下bool類型,注意:bool類型只有C++中才有,在C語言中沒有定義bool類型;
bool類型:在32位機器上佔1B,同樣在64位機器上佔1B。需要注意的是,在C++中,0為false,非0為true。實際上bool類型並沒有真正地佔1個位元組,
而只是佔了1bit。
通過下面的例子可以看出:
#include <stdio.h>int main(void){ bool flag = true; int num = 255;//255的二進位表示為11111111 if ((num & flag) == 1) { printf("flag only the position of end is not zero!\n"); } return 0;}
當然,毫無疑問,其結果就是:flag only the position of end is not zero!