回覆列表
  • 1 # IT劉小虎

    C語言將資料劃分為不同的資料型別,是為了在保持較小開銷的情況下,儘量精確的記錄和計算資料。要知道,C語言程式的宗旨就是“小開銷,高效率”。解決問題時,選擇合適的資料型別,能夠大大提升程式最終的效率。

    題主應該是想問C語言有哪些“基礎”資料型別吧?畢竟C語言是支援結構體語法的,它允許我們自定義各種資料型別。

    下面談談C語言中的基礎資料型別。

    整型

    計算機儲存的最小單位是位元組(Byte),一個位元組通常是 8 個 bit。我們常說的硬碟容量 500GB,就是指硬碟能夠儲存 500G 位元組的資料。

    C語言規定 char 型佔一個位元組的儲存空間,如果是 unsigned char(無符號),則可表示的取值範圍是 0~255。如果是 signed char(有符號),則取值範圍為 -128~127。

    定義 char 型變數時不指定 unsigned 或 signed ,C語言標準規定這種情況屬於 implemention defined,具體 char 型變數是否有符號取決於使用的編譯器。C語言標準的原則是:優先考慮效率,可移植性其次

    所以如果在對應的體系架構上,char 型變數有符號時效率最高,則編譯器就將其解釋為有符號。若char 型變數無符號時效率最高,則編譯器就將其解釋為無符號。

    應該沒有人故意寫出沒有移植性的程式碼,所以建議寫C語言程式碼用到 char 型變數時,顯性的指出其是否有符號。

    另外,整型資料型別還有 short int(可簡寫為 short),int, long int(可簡寫為 long),long long int(可簡寫為 long long)幾種,這些型別也可以加上 unsigned 或 signed 表示無符號型或有符號型。

    上面幾種整數型別與 char 型別的區別主要在於佔用的儲存空間不同,但是究竟這幾種整型型別佔幾個位元組,C語言標準沒有規定,所以在不同架構的計算機中,這幾種型別佔用的空間可能不同。

    例如在大多數 32 位計算機中,這幾種資料型別佔用的位元組數分別為 2,4,4,8。而在大多數 64 位計算機中,這幾種資料型別佔用的位元組數分別為 2,4,8,8。

    除了 char,其他幾種整型型別如果定義時沒有寫符號,則預設為是有符號的。

    浮點型

    C語言標準規定的浮點型有 float,double,long double,但是對每種資料型別佔用的儲存空間卻沒有規定。

    浮點型的實現在不同的平臺上的差異性比整型更大。有的處理器自帶的有浮點運算單元,稱為浮點運算的硬體實現。有的處理器沒有,只能用整型運算模擬,這稱為浮點運算的軟體實現

    我們在C語言程式設計時應選擇最合適的資料型別。例如某個變數的變化範圍是 0~100,那選擇 char 型別就足夠了(無論有沒有符號),選擇 long 型別會導致效能下降,原因在我之前的文章裡已經解釋過。如果某個變數的變化範圍可能超過 255,那就不能選擇 char 型別了,否則會造成資料溢位,例如

    編譯並執行這段C語言程式碼,會得到輸出:i=1。C語言程式中的資料溢位,可以藉助計算器直觀的看出,請看下圖:

    C語言的資料型別轉換

    C語言中的基本運算,如+-* /%這些算術運算以及> < >= <= == !=這些比較運算,都需要兩邊的資料型別一致,如果不一致,會自動轉換為一致的型別。例如:

    計算 sum 之前,程式會先把 a 和 b 提升為 int 型別(即所謂的“整形提升”)再相加。

    C語言的資料型別自動轉換,一般都是轉為佔用位元組數較多的型別,如果有浮點型,則優先轉為浮點型。

    例如,如果有一邊的型別為 long double,則把另一邊也轉為 long double;

    否則,如果有一邊為 double 型別,則把另一邊也轉為 double 型別;

    否則,如果有一邊為 float,則把另一邊也轉為 float 型別;

    。。。接著就是整型了,也是依次按照 long long -> long -> int -> short -> char 的順序轉換型別的。

    C語言在賦值時,也會做自動的型別轉換,例如:

    以上程式碼會輸出 “i=3”,i 只保留的 3.14 的整數部分。C語言還有強制型別轉換語法,只需要在要轉換的資料前加上 (要轉換的型別),例如:

    以上程式碼會輸出“j=1”,溢位的部分被忽略了。

    很多C語言初學者看到這些規則通常會很不舒服,覺得這不是在學程式設計而是在啃法律條文,結果越學越洩氣。

    是的,C語言並不像一個數學定理那樣完美,現實世界裡的東西總是不夠完美的。但還好啦,C語言程式設計師已經很幸福了,只要嚴格遵照C標準來寫程式碼,不要去觸碰那些陰暗角落,寫出來的程式碼就有很好的可移植性。

    想想那些可憐的JavaScript程式設計師吧,他們甚至連一個可以遵照的標準都沒有,一個瀏覽器一個樣,因而不得不為每一種瀏覽器的每一個版本分別寫不同的程式碼。

  • 中秋節和大豐收的關聯?
  • 瓦斯監測監控系統管理制度?