8.11.2013

Data type of C (I)

這一篇文章主要是在替自己註記C語言的資料型態。這其中的有一部份,我們經常使用,所以不容易忘記;但不常使用的部份,卻不容易記得。

所以,自己寫了一些程式碼來恢復一下深藏在腦海中的回憶。
#include <stdio.h>

int main(void) {

    printf("01. sizeof(int) = %d \n", sizeof(int));
    printf("02. sizeof(unsigned int) = %d \n", sizeof(unsigned int));
    printf("\n");
    printf("03. sizeof(short) = %d \n", sizeof(short));
    printf("04. sizeof(unsigned short) = %d \n", sizeof(unsigned short));
    printf("\n");
    printf("05. sizeof(long) = %d \n", sizeof(long));
    printf("06. sizeof(unsigned long) = %d \n", sizeof(unsigned long));
    printf("\n");
    printf("07. sizeof(char) = %d \n", sizeof(char));
    printf("08. sizeof(unsigned char) = %d \n", sizeof(unsigned char));
    printf("\n");
    printf("09. sizeof(long long) = %d \n", sizeof(long long));
    printf("10. sizeof(unsigned long long) = %d \n", sizeof(unsigned long long));
    printf("\n");
    printf("11. sizeof(_Bool) = %d \n", sizeof(_Bool));
    printf("12. sizeof(float) = %d \n", sizeof(float));
    printf("13. sizeof(double) = %d \n", sizeof(double));
    printf("14. sizeof(long double) = %d \n", sizeof(long double));

    return 0;
}
從以上的範例之中可以得知:在C99的標準之下,C語言的基本資料型態可以分成14種左右 (其實自己也不是很確定,應該是這樣吧)

sizeof()出來的單位結果,是Byte (8 bits)。但這樣的結果並不是絕對,在不一樣的平台,會有不一樣的結果。

在C99下,也支援了─signed關鍵字,signed int和int的宣告,是一模一樣地,但我們通常都會把signed給省略。但unsigned就不能隨便省略了。

有無unsigned是差異很大的,會影響到此一資料型態值的範疇。以下是上例的執行結果:


那,這些資料型態的範圍是如何定義的?? 以sizeof(short) = 2 (Bytes) == 16 bits。所以,換句話說,short這種資料型態可以支援的範圍就是2的16次方,也就是65,536。但別忘記了,0也是一個值,所以unsigned short的範圍就是0~65,535 (共65,536個);而short就是正負各切一半:65,536 / 2 = 32,768,負值的部份就是-1~-32,768,正值的部份就是0~32,767。其餘的資料型態以此類推。

01. int: -2,147,483,648 ~ 2,147,483,647
02. unsigned int: 0 ~ 4,294,967,295
03. short: -32,768 ~ 32,767
04. unsigned short: 0 ~ 65,535
05. long: -2,147,483,648 ~ 2,147,483,647
06. unsigned long: 0 ~ 4,294,967,295
07. char: -128 ~ 127
08. unsigned char: 0 ~ 255
09. long long: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
10. unsigned long long: 0 ~ 18,446,744,073,709,551,615
11. _Bool: true | false
12. float: 3.4E-38 ~ 3.4E+38
13. double: 1.7E-308 ~ 1.7E+308
14. long double: 3.4E-4932到3.4E4932

其中比較要注意的是:C99已有支援_Bool的資料型態,它的大小跟char一樣,都是8 bits;但實際上只用到0和1而已。

float、double和衍生的long double的位元配置和其它的整數型態的資料不太一樣,所以沒有unsigned這種前置修飾,請自行翻閱Computer Overview相關書籍。

那麼,各式各樣的資料型態,我們又該如何做初始化 (Initialization)宣告 (Declare)??

假設,我們要宣告一個變數為0;但int、unsigned int、short、long等所有的資料型態都有包含0,這個時後,我們可以用後綴修飾:0L,表示這個0是以long的資料型態來儲存

內容太多了!! 先寫到這....@@

(To be continue....)

沒有留言:

張貼留言