C 語言基礎教程(我的C之旅開始了)[四]_C 語言

來源:互聯網
上載者:User

10. 基礎資料型別 (Elementary Data Type):整型(上)

1. 整型 int

    C 語言提供了很多整數類型(整型),這些整型的區別在於它們的取值範圍的大小,以及是否可以為負。int 是整型之一,一般被稱為整型。
    int 代表有符號整數,也就是說,用 int 聲明的變數可以是正數,可以是負數,也可以是零,但是只能是整數。標準規定 int 的最小取值範圍是 -32767 到 32767。int 的取值範圍因機器而異,但是一定要大於或者等於-32767到 32767。一般來說,int 佔用一個的記憶體空間。因此,字長為 16 位的舊式 IBM 相容機使用 16 位來儲存整型 int ,取值範圍是 -32768 到 32767 。目前的個人電腦一般都是 32 位字長的,這些電腦中,int一般也是32位的,取值範圍是 -2147483648到 2147483647 。對於使用 64 位元 CPU 的電腦,使用更多位元組儲存 int 也是很自然的事情,取值範圍當然也會更大。


2. 聲明 int 類型的變數

    正如我們在以前的教程裡看到的那樣,int 用於聲明整型變數:以 int 打頭,後面跟著變數的名字,最後以分號(;)結束。例如:

        int erns;  /* 聲明一個變數 */
        /* 注意:一定要用逗號(,),不能用分號(;)*/
        int hogs, cows, goats;  /* 聲明三個變數 */

    以上聲明建立了變數,但是沒有給它們提供“(value)”。在前面的教程中,我們已經用了兩種方法使變數獲得“值”。一種是賦值:cows = 500; 。另一種是使用 scanf 函數:scanf( "%d", &goats ); 。下面我們來學習第三種方法。


3. 初始設定變數

    初始設定變數是指給變數賦初值:聲明變數的時候,在變數名的後面寫上等號(=),然後寫下你希望賦予變數的“值”。例如:

        int hogs = 21;
        int cows = 32, goats = 14;
        int dogs, cats = 94;

    以上聲明建立了變數,並且為這些變數分配了空間,同時也賦了初值。注意,第三行中只有 cats 被初始化為 94,而 dogs 沒有被初始化!如下圖:

 


4. int 常量

    上面的例子中,21、32、14,以及 94 都是整數常量。C 語言中,整數常量的預設類型是 int ,也就是說,整數常量佔用記憶體空間的大小一般等於 int 類型的變數佔用空間的大小。如果整數常量的大小超過了 int 的取值範圍,那麼編譯器將會把這個整數常量當作 long int 類型來處理,這個我們後面還會講到。
21、32、14 和 94 都在 int 的取值範圍之內,因此它們都是 int 常量。


5. 輸出 int 型資料
    我們可以用 printf 函數來輸出 int 型資料。正如我們在前面的教程中看到的那樣,預留位置 %d 代表輸出的是 int 型資料,它告訴 printf 函數在什麼地方輸出相應的 int 型資料。%d 也被稱為格式限定符(format specifier),因為它指定了 printf 函數應該使用什麼形式來輸出資料。printf 函數的第一個參數只能是字串,這個字串被稱為格式串(format string)。格式串中有多少個 %d,我們就應該相應地提供多少個 int 型參數給 printf 函數。int 型參數可以是 int 型變數,int 型常量,以及結果為 int 型的運算式等。例如:

        int year = 2005; /* year 是 int 型變數 */
           printf( "Today is %d-%d-%d\n", year, 9, 20 + 9 ); /* 20 + 9 是加法運算式 */

保證格式限定符的數目和參數數目一致是我們的責任,編譯器不負責捕捉這種錯誤!例如:

            #include <stdio.h>

            int main(void)
            {
                int ten = 10, two = 2;

                printf("%d minus %d is %d\n", ten ); /* 少寫了兩個參數 */

                getchar();  /* 等待使用者按斷行符號 */
                return 0;
            }

這個程式可以通過編譯,但是運行結果將會出乎意料,因為我們少寫了兩個參數。第一個 %d 被參數 ten 的值代替,而另外兩個 %d 將被記憶體中本來儲存著的值代替。因為記憶體中本來儲存著的值是不確定的,所以輸出結果是不確定的。


6. 八進位(octal)和十六進位(hexadecimal)

    C 語言中,整數常量預設是十進位(decimal)整數。通過在整數常量前面加上特定的首碼,可以把它設定為八進位或者十六進位整數。首碼 0x 或者 0X 把整數常量設定為十六進位整數。注意,是數字 0 ,而不是字母 O ,別搞錯了哦!例如:十進位的 16 用十六進位來表示是 0x10 或者 0X10 。在整數常量前面加上首碼 0 ,表示它是八進位整數。注意,是數字 0 ,而不是字母 O 。例如:十進位的 16 表示為八進位就是 020 。


7. 以八進位或者十六進位形式輸出資料

    使用格式限定符 %o 可以以八進位的形式輸出整數。注意,是小寫字母 o ,不是數字 0 。使用 %x 或者 %X 可以以十六進位的形式輸出整數。小寫 x 表示輸出使用小寫字母,大寫 X 表示輸出使用大寫字母。使用 %#o,%#x 或者 %#X,得到的輸出將包括首碼 0,0x 或者 0X。例如:

            #include <stdio.h>

            int main(void)
            {
                int x = 200;

                printf("dec = %d; octal = %o; hex = %x; HEX = %X\n", x, x, x, x);
                printf("dec = %d; octal = %#o; hex = %#x; HEX = %#X\n", x, x, x, x);

                getchar();
                return 0;
            }

這個程式的輸出是:

        dec = 200; octal = 310; hex = c8; HEX = C8
        dec = 200; octal = 0310; hex = 0xc8; HEX = 0XC8

11. 基礎資料型別 (Elementary Data Type):整型(中)

 

1. 其它整數類型

    int 是 C 語言的基本整數類型,可以滿足我們處理一般資料的需求。C 語言還提供了四個可以修飾int的關鍵字:short、long、signed,以及unsigned。利用這四個關鍵字,C 語言標準定義了以下整數類型:

      1) short int(可簡寫為 short),和 int 一樣,也是有符號整數
      2) long int(簡寫:long),有符號整數
      3) long long int(簡寫:long long),C99 標準添加的類型,
         有符號整數
      4) unsigned int(簡寫:unsigned),不帶正負號的整數,不能表示負數
      5) unsigned long int(簡寫:unsigned long),不帶正負號的整數,
         不能表示負數
      6) unsigned short int(簡寫:unsigned short),不帶正負號的整數,
         不能表示負數
      7) unsigned long long int(簡寫:unsigned long long),
         C99 添加的類型,不帶正負號的整數
      8) 所有沒有標明 unsigned 的整數類型預設都是有符號整數。
         在這些整數類型前面加上 signed 可以使讀者更清楚地知道
         這些是有符號整數,儘管有沒有 signed 都表示有符號整數。
         例如:signed int 等同於 int 。

    一般我們把 short 稱為短整型,把 long 稱為長整型,把 long long 稱為超長整型,把 int 稱為整型。unsigned 打頭的那些整數類型統稱為無符號整型。例如:我們稱 unsigned short 為無符號短整型。以此類推。


2. 聲明方式

    這些整數類型的聲明方式與 int 類型的聲明方式一樣。例如:

        long int estine;
        long johns;
        short int erns;
        short ribs;
        unsigned int s_count;
        unsigned players;
        unsigned long headcount;
        unsigned short yesvotes;
        long long ago;  /* C99 特有 */
        unsigned long long ego;  /* C99 特有 */

如果您的編譯器不支援C99標準,那就不能使用long long和unsigned long long。


3. 取值範圍(表示範圍)

    標準也規定了這些整數類型的最小取值範圍。short 的最小表示範圍和 int 一樣,都是 -32767 到 32767 。也就是 -(2^15 - 1)到(2^15 - 1)。其中,2^15表示 2 的 15 次方。類似地,2 的 20 次方記作 2^20 ,以此類推。注意:C 語言中 2^15 並不表示 2 的 15 次方,為了書寫方便,我們姑且這麼表示。long 的最小取值範圍是 -2147483647 到 2147483647 。也就是 -(2^31 - 1) 到
(2^31 - 1) 。unsigned short的最小表示範圍和unsigned int 一樣,都是 0 到 65535(2^16 - 1)。unsigned long 的最小取值範圍是 0 到 4294967295(2^32 - 1)。long long的最小取值範圍是 -9223372036854775807(-(2^63 - 1))到 9223372036854775807(2^63 - 1);unsigned long long 是 0 到
18446744073709551615(2^64 - 1)。
    標準規定,int 的表示範圍不能小於 short 的表示範圍,long 的表示範圍不能小於 int 的表示範圍。這就是說 short 型變數佔用的空間可能比 int 型變數少,而 long 型變數佔用的空間可能比 int 型變數多。16 位(bit)的電腦中,int 和 short 一般都是 16 位,而 long 是 32位;32位的電腦中,short一般是 16 位,而long和int是 32位。TC2(16位的編譯器)中,int是16位的;而 Dev-C++(32 位的編譯器)中,int 是 32 位的。
    使用 unsigned int 聲明的變數只能表示正整數。如果 int 是 16 位的話,那麼 unsigned int 的表示範圍是 0 到65535(2^16 - 1)。這是因為unsigned 不需要符號位,可以把 16 個位全都用於表示整數。而 int 需要一個位作為符號位,用於表示正負,只有 15 個位用於表示整數。
    目前,long long 一般 64 位元,long 是 32 位,short 是 16 位,而 int 或者 16 位,或者 32 位。具體某個編譯器到底使用多少位來表示這些類型,我們可以用運算子 sizeof 來擷取。例如:

          printf( "%lu\n", (unsigned long)sizeof(int) * 8 );  /* 輸出 int 的位元 */
          printf( "%zu\n", sizeof(short) * 8 );  /* 輸出 short 的位元 */

    sizeof 的用法我們以後會講到,現在只要有個印象就好了。第二句中的 %zu 是 C99 特有的,如果您的編譯器不支援 C99(準確地說,應該是如果您的編譯器使用的庫函數不支援 C99),運行結果將會出錯。


4. 整數類型的選擇

    如果您要處理的只是正整數,那麼應該優先使用 unsigned 打頭的那些整數類型。如果您要處理的整數超出了int所能表示的範圍,並且您的編譯器中,long的表示範圍比 int 大,那就使用 long 。不過,若非必要,盡量不要用 long ,因為它可能會降低程式運行效率。有一點要注意:如果您的編譯器中,long和int都是32位的,並且您需要使用32位整數,那麼應該用long,而不要用int。只有這樣,我們的程式才可以安全地移植到16位的電腦,因為 16位的電腦中,int 一般也是16位的。類似地,如果您需要使用64位整數,那就用 long long。如果 int 是 32 位的話,那麼使用 short 可以節省空間的,不過您得確保您要處理的整數不會超出 short 的表示範圍。這種“節省”對記憶體大的電腦來說,是沒什麼意義的。
 

5. long 型常量和 long long 型常量

    一般來說,整數常量是被當作 int 類型來儲存的。如果我們使用的整數常量超出了 int 的表示範圍,C 語言規定編譯器自動使用 unsigned int 來處理這個常量。如果 unsigned也不足以表示這個常量的話,編譯器就會用long 。如果還表示不了的話,那就依次用unsigned long,long long,unsigned long long。如果unsigned long long也表示不了,那麼編譯器就沒轍了。注意:long long 和unsigned long long 是 C99 特有的。例如:如果 int 是 16 位的話,它就表示不了常量 1000000。編譯器會使用 long 來處理這個常量,因為 unsigned int 也表示不了 1000000 。
    同樣,十六進位和八進位整數常量通常也是被作為 int 來處理。但是,當我們使用的常量超出了int的表示範圍後,編譯器會依次使用unsigned int,long,unsigned long,long long 和 unsigned long long。直到所使用的類型足以表示那個常量為止。
    有時,我們使用的是較小的常量,但是我們希望這個常量被當作 long 來處理,這就需要在這個常量後面加上尾碼 l(小寫字母 l)或者 L(大寫字母 L)。我們應該避免使用 l ,因為 l 容易和數字 1 混淆。例如:整數常量 7 是被作為 int 來處理的,但整數常量 7L(或者 7l)是被作為 long 來處理的。類似地,在整數常量後面加上尾碼 ll 或者 LL ,這個常量就會被當作 long long 來處理。例如:3LL 。如果想使用不帶正負號的整數常量的話,還要配合使用尾碼 u 或者 U 。例如:2u,3U,4Lu,5ul,6LU,7LLU,8Ull,9uLL 。
    這些尾碼也可以用於十六進位和八進位整數常量。例如:020L,010LL,
0x30uL,0x40ull 。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.