C 語言基本數據類型:字元型(char)整形(short, int, long)浮點型(float, double) 註:如下類型位元組數指一般情況,不同的平臺會有所不同,具體平臺可以用sizeof 關鍵字測試一下. -2147483648~~2147483647 0~~4294967295 -3.4 ...
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 long |
0~~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數溢出,因此最好用的長整形,那麼你就會為自己加分了