【C/C++語言入門篇】-- 基本數據類型

前一篇我們介紹了一個簡單不過的helloworld程序引出相關問題。趁着還沒有忘掉那些思考方式的記憶,本篇繼續延續這種思維方式的理念,介紹一下CC++中的基本數據類型。數據類型不清楚的話在以後的編程中會有很多謎團和問題。甚至一個程序的BUG找半天也沒有找出來時爲什麼,結果才發現是加減溢出了。更加嚴重的還有寫越界、讀越界等。同樣比如網絡傳輸時的消息結構對待每個字節,每個成員的大小及類型都有很嚴格的追求。下面我們就逐個進行介紹。

 

首先、我們看32位的整數:int 、unsigned int、long、unsigned long 。這些都是基本類型,沒有unsigned關鍵字的是有符號的,反之是無符號的。還有比如DWORD、 UINT這些也只是寫別名(typedef)而已。有符號整數值得注意的是什麼範圍內是正數,什麼範圍是負數。這樣對於加減運算、比較運算等有很大幫助,否則很容易溢出或者比較錯誤。舉個例子:

 

unsigned int loop = 5; 

for ( ; loop >= 0; --loop )
{
     .......
}

這樣一個循環,稍微不注意。就認爲它是成立的,其實他是一個死循環。這裏會減到0,成立繼續減。由於是無符號,將減成最大的32位無符號整數:0xffffffff. 之後繼續減,因此爲死循環。說到這裏,又要提出一個問題了。我們需要記住常用的一些十六進制數,比如:0xffffffff, 0x80000000, 0x7fffffff等。那麼:

1. 爲什麼需要記住這些?這些數有什麼特點?在有符號和無符號32位整數裏,它們分別代表什麼?

 

其次、是16位整數,(short)佔2字節。需要注意的跟上面32位整數差不多。

2. 根據第一個問題,大家可以猜猜16位甚至8位有符號、無符號整數需要記住常用的16進制數有哪些?

 

再次、是8位整數,也可以理解成字符。比如char、unsigned char、bool. 這裏只描述了基本的類型,其它typedef也是根據這些變了名字而已。在這裏需要認識一點,char別始終認爲是用在字符上,同樣要有觀念它是整數,而且是有符號的。大家可以做實驗去了解他的範圍。在上面的兩個問題裏,我相信你只要答對了,也就知道他的範圍了。這裏的bool需要說明,bool只有0或1兩個狀態,在內存裏。因此它的範圍只有0~1,嘿嘿!也就是false~true了喲。

 

在我們寫程序的時候,腦子裏第一反應可以不受數據類型的限制。我們可以首先想到這個類型佔用多少個字節,就認爲它就是一塊兒內存。你可以理解成線段或者進度條的一部分。然後再看這個數據類型(基本數據類型)是否爲有符號,然後你在寫程序的時候就能有效的控制它的最大數,最小數。從而避免發生溢出等。

 

數據類型,說白了只是語法上的限制。你要是稍微底層一點或者指針操作,那麼類型都可以忽略。一切都是在操作內存,即一切都在你的掌控之中。有符號或者無符號只是在比較運算和感官上有正負。在內存中存放的數據是沒有符號可言的,你可以這麼理解,一個unsigned int 變量的值爲0xffffffff,那麼同樣是0xffffffff表示爲int類型,它就等於-1。而在內存中都是同樣的存儲方式。所以,首先我們得跨過數據類型給我們帶來的某些迷惑。不要讓它限制了我們的思維。我們不能坐井底觀藍天以爲自己在世外桃源,而不知自己卻身處荒漠。我們得跳出去看世界。

 

本來想提個問題讓大家去看看每種數據類型在內存中是這麼存放的,在內存中觀察我們的變量佔用的字節數及所在位置(內存地址)的。但是可能有的朋友對VC(我是用的VC2005)不是很熟。內存窗口在哪兒也不知道。那麼這個問題就留給知道的人去摸索吧,至於不知道的朋友,我會在以後專門講調試技巧的時候講VC的一些常用於調試時觀察的窗口。

 

好了,繼續我們的探索。下面一個數據類型是64位整數,C99 爲 C 語言擴展了新的整數類型 long long ,通常被定義成 64 位寬。但是 C 標準並沒有定義具體的整數類型的寬度,只定義了 long long 的級別高於 long, long 的級別高於int, int 的級別高於 short ,short 的級別高於 char 。級別高的整數類型的寬度大於等於級別較低的整數類型。佔用字節數位8字節,同樣需要注意的也在上面提出了。另外根據這些需要記住的16進制數,大家可以對內存有個比以前更直觀的理解了。16禁止數每一位表示4位,2位表示一個字節。比如:0xff就表示一個字節(這裏只是純觀察哈)了。0xf就表示字節的低4位全是1,在二進制上爲: 0000 1111。夠直觀吧? - -

 

再者就是浮點數,有32位和64位。浮點數在內存中看是看不出是否爲浮點數的,因爲跟整數的存法沒有上面區別。但程序是怎麼知道那是浮點數的呢?呵呵,浮點數在存放進內存的時候是通過換算之後才存入內存的,以後我們單獨列出來講浮點數的存儲。大家也可以去搜索一些先了解下。另外,很多黑客也喜歡記住一些特殊的浮點數換算後存放在內存中的16進制數。對他們逆向及分析一些病毒等有很大幫助。

 

還有就是void類型,大家可能最初認識void的時候是寫函數的時候,比如 void function()表示沒有返回值。以後在指針那節時會講到void類型的指針。這裏先做個瞭解。

 

另外其它的數據類型比如,結構體類型、枚舉類型、聯合等這些非基本數據類型將在後面逐個介紹。還有將小類型數據合併成大數據,合併小類型數據進行一次性賦值寫入或者讀取,我們將在位運算和指針章節講解。

 

最後,大家可以用sizeof分別求求這些基本類型所佔用的字節數。記得這些數據類型的大小對大家很有幫助。比如以後的結構體對其問題,還有位域的使用等。以後逐一介紹。

 

問題:

3. 研究下這些基本類型如果用printf輸出,在格式化字符串的時候應該怎麼寫?比如:

    int a = 100;

    printf( "%d", a );  int類型使用的是%d,那麼其它的呢? 還有輸出16進制數佔8字符寬度帶0x前綴的呢? 

 

4. 怎麼判斷一個無符號32位整數是否加運算溢出呢?比如:

   unsigned int count = 0x80000000;

   count += count;

   判斷count是否會加法溢出,不會溢出才執行:count += count;

 

【C/C++入門篇系列】

【C/C++語言入門篇】-- 序言

【C/C++語言入門篇】-- HelloWorld思考

【C/C++語言入門篇】-- 基本數據類型

【C/C++語言入門篇】-- 調試基礎

【C/C++語言入門篇】-- 深入指針

【C/C++語言入門篇】-- 數組與指針

【C/C++語言入門篇】-- 結構體

【C/C++語言入門篇】-- 深入函數

【C/C++語言入門篇】-- 位運算

【C/C++語言入門篇】-- 剖析浮點數

【C/C++語言入門篇】-- 文件操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章