C++ bool,char,short,int,long,float,double資料型別大小以及資料溢位值求解
阿新 • • 發佈:2019-02-11
以下討論皆在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),負數在記憶體中以補碼形式儲存short i = 65537; //記憶體中實際值是i = 1,如何得到? 65537的二進位制是 1 0000 0000 0000 0001,因為有一位超出了short的範圍,超出的部分直接捨棄(從低往高存,存到16位就結束了,第17位完全沒記錄),所以記憶體中二進位制是0000 0000 0000 0001,符號位為0,正數在記憶體中以原碼儲存