深入學習C語言時,有必要先了解一下數據類型的概念,以及它們之間的混合運算與類型轉換。
本篇文章便是根據《C語言程序設計教程》和在線翻閱資料后整理而出。(練習題將逐步更新)
目錄:
一、概述
二、類型修飾符
三、各種數據類型介紹
四、不同類型數據間的混合運算與類型轉換轉換
五、練習
一、概述
程序所能處理的基本數據對象被划分成一些組或一些集合。它們都采用同樣的編碼方式,對它們能做同樣的操作。把程序中具有這樣性質的集合,成為數據類型。CPU對不同的數據類型提供了不同的操作指令
C語言中的類型按其組成可以分為簡單類型和構造類型,按是否預定義了類型名字和值集可以分為基本類型和非基本類型,按是否加了類型限定符可以分為限定類型和非限定類型
用ProcessOn作圖,C語言數據類型如下:
二、類型修飾符
除void類型外,基本數據類型之前都可以加各種類型修飾符,類型修飾符有如下四種:
1.signed----有符號,可修飾char、int。int是默認有符號的
2.unsigned-----無符號,修飾int 、char
3.long------長型,修飾int 、double
4.short------短型,修飾int
三、各種數據類型介紹
1.基本數據類型
(以下各數據類型字長均指32位操作系統下,可用printf("%d",sizeof(數據類型名));進行測試。具體字長由具體編譯器決定,但確定的關系是:sizeof(short)≤sizeof(int)≤sizeof(long))
整型:整形包括短整型、整形和長整形
短整型:
有符號短整型:short [int] 2byte -32768~32767
無符號短整型:unsigned short [int] 2 byte 0~65535
整型:
長整形:
有符號長整型:long [int]/signed long [int] 4 byte -2147483648~2147483647
超長整型(C99 標准添加的類型):long long [int] 8 byte 0~18446744073709552000
P.S(C語言中整型和長整形都占4字節的原因):
早期的C編譯平台下整形和長整型分別是2和4字節。隨着編譯平台版本的升級,現在二者都是4字節,short是2字節。另外整型數的字長與CPU的字長沒有密切關系:早期的int是2字節,但那時的CPU也已經是32位的了;再者你把現在4字節int編譯平台安裝在64位CPU機上去,同樣只能編譯4字節int的代碼,並不因為CPU成8字節了,你代碼中的int也成8字節了。(摘自百度知道)
long從字面上看,應該是64位才更合理,把long當成32位實在是一個歷史的包袱。像C#那樣新起爐灶的程序語言,由於沒有需要支持老代碼的問題,就把long當作64位來處理了。
在32位平台下,long是相對short而言,long(short)類型是long(short)int類型的簡稱,sizeof(long) = sizeof(int) = 4。int和long的范圍雖然一樣,但輸入輸出格式不同,printf int的格式為%d,而printf long的格式為%ld。
考慮到程序的可移植性,還是要將他們區分開來。但當要求的數值范圍為4byte時,建議使用int類型,因為第一版的C語言只有一種類型,那就是int。(摘自百度文庫)
浮點型:
單精度浮點型:float 4 byte -3.4E38~3.4E38
雙精度浮點型:double 8 byte 1.7E308~1.7E308 long double 8 byte
字符型:
2.指針類型:
有關指針的數據類型
int i ————定義整形變量i
int *p———- p為指向整型變量的指針變量
int a[n]——- 定義整型數組a,它有n個元素
int *p[n]—– 定義指針數組p,它由n個指向整型數據的指針元素組成
int (*p)[n] —p為指向含n個元素的一維數組的指針變量
int f()——— f為返回整數型函數值的元素
int *p()——- p為返回一個指針,該指針指向整型數據 或 整形數組
int (*p)() —–p為指向函數的指針,該函數返回一個整數值
int **p—- —-p是一個指針變量,它指向一個指向整數型數據的指針變量
延伸可參考:基於指針的數據類型與指針運算小結 http://www.jb51.net/article/41051.htm
3.構造類型:struct
C語言構造類型分為:數組類型,結構類型和共用體類型
數組類型:是由相同基本類型若干個元素組織在一起數據,它們有先后順序,也可以按這個順序對這些元素訪問
如int a[10],共有10個元素,第個元素的類型都相同,都為整型
這10 個元素,按順序分別是a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]
結構體類型:在C語言中,結構體(struct)指的是一種數據結構,是C語言中聚合數據類型(aggregate data type)的一類。結構體可以被聲明為變量、指針或數組等,用以實現較復雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問
在C語言中,定義一個結構的一般形式為:
struct結構名
{
//成員表列
};
延伸可參考:C語言結構體(struct)常見使用方法 http://blog.csdn.net/huqinwei987/article/details/23625823
共用體類型:union
幾個不同的變量共同占用一段內存的結構,在C語言中,被稱作“共用體”類型結構,簡稱共用體。注:在某些書籍中可能稱之為“聯合體”,但是“共用體”更能反映該類型在內存的特點
在C語言中,定義一個結構的一般形式為:
union 共用體名
4.空類型:void
常用在程序編寫中對定義函數的參數類型、返回值、函數中指針類型進行聲明。
具體參考void百科 http://baike.baidu.com/item/void/5126319?fr=aladdin
四、不同類型數據間的混合運算與類型轉換
1.自動類型轉換
在C語言中,自動類型轉換遵循以下規則:
①若參與運算量的類型不同,則先轉換成同一類型,然后進行運算
②轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型后再進行運算
a、若兩種類型的字節數不同,轉換成字節數高的類型
b、若兩種類型的字節數相同,且一種有符號,一種無符號,則轉換成無符號類型
③所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double型,再作運算
④char型和short型參與運算時,必須先轉換成int型
⑤在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四舍五入向前舍入
2.強制類型轉換
強制類型轉換一般格式如下:
(類型名)(表達式)
這種強制類型轉換操作並不改變操作數本身
五、練習題
(練習題將逐步更新)
參考鏈接:
C語言基本數據類型簡介:http://www.cnblogs.com/onedime/archive/2012/11/21/2780149.html
深入解析unsigned int 和 int http://www.jb51.net/article/40518.htm