C 語言基本數據類型:字符型(char)整形(short, int, long)浮點型(float, double)
注:如下類型字節數指一般情況,不同的平台會有所不同,具體平台可以用sizeof 關鍵字測試一下.
類型 字節數 類型 字節數 char 1 short 2 int 2(16位系統)或4(32位系統) long 4 float 4 double 8
類型 范圍 類型 范圍 (signed)char -128~~127 unsigned char 0~~255 (signed)short -32768~~32767 unsigned short 0~~65535 (signed)int -32768~~32767 unsigned int 0~~65535 (signed)long
-2147483648~~2147483647
unsigned long0~~4294967295
float-3.4*10-38 ~~ 3.4*1038
double-1.7*10-308 ~~ 1.7*10308
1. 運算會導致字符型/整型溢出其取值范圍
eg.
int main() { signed char ch = 127; ch += 1; printf("%d\n", ch); return 0; }
輸出結果為:-128,注意,定義ch時賦予的值為127,已經是char能表示的最大數,其最終結果-128的來歷是這樣的:
第一步:首先127在計算機中用二進制表示為:01111111;
第二步:01111111 + 00000001 = 10000000;
第三步:由於ch是帶符號的,當最高位為1時,表示是負數,而負數的計算機中是利用補碼來存儲的,回憶計算負數補碼的方法(首先取負數的絕對值,然後求二進制,對二進制取反,在對取反後的值加1,即為負數的補碼);
第四步:於是根據求補碼的反步驟,我們來求最原始的負數,由於本題中補碼為10000000,首先10000000 - 00000001 = 01111111,然後對01111111取反為10000000,10000000 = 128,由於本身是負數,即ch為-128.
eg.
int main() { unsigned char ch = 255; ch += 1; printf("%d\n", ch); return 0; }
輸出結果為:0;
其分析為:首先ch = 255提升為整形,在計算機的存儲為:(000....)11111111,然後(000....)11111111+1 = (000...)0001 00000000;然後再將最後的八位二進制截取給ch,由於最後八位全是0,因此ch = 0了。
同理:對於遇到整形int short, long等出現上述情況時,我們也可以這樣分析得到結果.
2.用預處理指令#define 聲明一個常數,用以表明1年中有多少秒?
#define SECOND_PER_YEAR (60*60*24*365)UL
①#define語法的基本常識(例如:不能以分號結束,括號的使用等等)
所有宏定義、枚舉常數、只讀變量全用大寫字母命名,用下劃線分割單詞.
const int MAX_LENGTH = 100; //這不是常量,而是一個只讀變量,具體請往後看
#define FILE_PATH “/usr/tmp”
②寫出你是如何計算一年中有多少秒而不是計算實際的值,會更有價值
③意識到這個表達式將使一個int數溢出,因此最好用的長整形,那麼你就會為自己加分了