1. 程式人生 > >C++ bool,char,short,int,long,float,double資料型別大小以及資料溢位值求解

C++ bool,char,short,int,long,float,double資料型別大小以及資料溢位值求解

以下討論皆在32位編譯環境

型別含義 位元組數取值範圍

bool                        布林型10,1

char字元型 1[-2^7, 2^7-1] (2^7 = 128)

wchar_t寬字元2[-2^15, 2^15-1] (2^15 = 32768)

short短整型 2[-2^15, 2^15-1] (2^15 = 32768)

int整型 4[-2^31,  2^31-1] (2^31 = 2147483648)

unsigned無符號整型4[0, 2^32 - 1] (2^32 = 4294967296)

long長整型 4[-2^31,  2^31-1] (2^31 = 2147483648)

float單精度 4[1.17 * 10^-38, 3.4 * 10^38] (這裡只是正數範圍內,負數範圍對稱過去)

long long長整型8[-2^63, 2^63-1] (2^63 = 9223372036854775808)

double雙精度 8[2.225*10^-308, 1.797*10^308](這裡只是正數範圍內,負數範圍對稱過去)

小提示:float值一般能保證6位有效位數字,double一般保證10位有效數字

接著關於資料型別數值溢位情況的討論:(以short型別為例)

short i = -32769;  // 記憶體中實際值是i = 32767,如何得到?

short位元組數為2,每個位元組長度8bit,所以一個short型別使用16bit表示,一個bit即一個二進位制的值,所以-32769的二進位制是 (1)1000 0000 0000 0001,因為是負數(符號位,即最高位為1),負數在記憶體中以補碼形式儲存
原碼到補碼只需原碼取反,再加1。這裡由於最高位除了作為符號位外,還參與了數值表示,所以在取反時,最高位同樣取反,最終得到0111 1111 1111 1111,轉化為十進位制即為32767 short i = 32769; //記憶體中實際的值是 i = -32767,如何得到? 32769的二進位制是1000 0000 0000 0001,由於最高位是1,表示為負數,即該碼為某負數的補碼,補碼到原碼同樣只需取反加1操作,取反時符號位保持不變,最終得到1111 1111 1111 1111,轉化為十進位制即為-32767
short i = 65537; //記憶體中實際值是i = 1,如何得到? 65537的二進位制是 1 0000 0000 0000 0001,因為有一位超出了short的範圍,超出的部分直接捨棄(從低往高存,存到16位就結束了,第17位完全沒記錄),所以記憶體中二進位制是0000 0000 0000 0001,符號位為0,正數在記憶體中以原碼儲存
,轉化為十進位制是1 short i = -65537; // 記憶體中實際值是 i = -1,如何得到? 對於超出short位數範圍的負數,先不管符號,按照正數來,得到它的二進位制,超出部分直接捨棄,剩下的部分存入記憶體,同時加入符號位,所以最終二進位制是1000 0000 0000 0001,轉化為十進位制是-1 (感覺還是有問題。。。。)