C初階1:基本數據類型

本節課理論知識較多。

  1. C語言有哪些數據類型?有哪些整數類型?有哪些浮點類型?
  2. 各種數據類型如何表示?輸入輸出格式化有哪些?
  3. 各種類型大小是多少?范圍是多少?
  4. 如何選擇整型類型和浮點類型?

1. 數據類型

學習是一個日積月累的過程,從多模仿,到多看多想,最后到多用。

數值類型分為整型(整數)和浮點型(小數)。按照表示數字范圍的從大到小

  • 整數分為五類:字符型(char)、短整型(short)、整型(int)、長整型(long)和長長整型(long long)
  • 浮點型分三類:單精度型(float)、雙精度型(double)和長雙精度型(long double)

1.1 獲取類型大小

關鍵字sizeof:查看變量或者類型大小

int n;
printf("%d",sizeof(int));
printf("%d",sizeof(n));

上面的括號不是必須的,但是建議帶上。所以也可以如下表示:

int n;
printf("%d",sizeof int);
printf("%d",sizeof n);

2.2 各種類型的大小

printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(short)=%d\n",sizeof(short));
printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(long)=%d\n",sizeof(long));
printf("sizeof(long long)=%d\n",sizeof(long long));
printf("sizeof(float)=%d\n",sizeof(float));
printf("sizeof(double)=%d\n",sizeof(double));
printf("sizeof(long double)=%d\n",sizeof(long double));

在編譯命令加上選項-m32再試一下。

通常有些類型大小并不是固定的,計算機硬件、操作系統和編譯器都會影響類型的大小。通常類型大小有如下規律:
char < short < int < float < double
int <= long <= long long

在常用的計算機硬件和操作系統中,各種類型的大小如下表所示:

2.3 字節

sizeof獲得數據的單位是Byte(字節)。Byte(字節)是計量存儲容量的一種計量單位,一個字節是8位二進制,可容納256個數字。一個ASCII字符就是一個字節。

除了Byte(字節),還有其他常用存儲容量單位

No. 單位 說明
1 bit(比特/位) 計算機中的最小數據單位,1個Byte(字節)=8個bit(比特/位)
2 word(字) 計算機CPU一次操作處理實際數據最大位數,我們常說的32/64位就是計算機的字。
3 KB 1KB=1024B
4 MB 1MB=1024KB
5 GB 1GB=1024MB
6 TB 1TB=1024GB

有時,我們用B表示Byte(字節),用b表示bit(比特/位),注意兩者區別。

2.4 輸入輸出格式化

No. 類型 占位符
1 char %c
2 short %hd
3 int %d
4 long %ld
5 long long %lld
6 float %f
7 double %lf
8 long double %Lf

double的輸入占位符必須是%lf,輸出占位符可以是%f


2. 整數類型

2.1 表示范圍

每種數據類型大小不同,各自表示數據范圍也不同。下面的常用類型的范圍。

No. 類型 數字范圍 表示
1 char -128~127 -27~27-1
2 short -32 768~32 767\pm3 -215~215-1
3 int -2 147 483 648~2 147 483 647\pm21 -231~231-1
4 long long -9 223 372 036 854 775 808~9 223 372 036 854 775 807\pm10^{20} -263~263-1

上面的是通常范圍(32位下),實際上有些情況略有出入。總之,類型的表示范圍與類型大小存在如下關系:
-2^{n-1} \sim 2^{n-1}-1
其中,n是類型大小。

2.2 無符號整型

在一些特殊情況下,數據只用0和整數,不存在負數,這時可以使用無符號整型unsigned。無符號整型只是在原來的整型前加上關鍵字unsigned。因為沒有負數,所以數值的表示范圍擴大了一倍。

No. 類型 數字范圍 表示
1 unsigned char 0~255 0~28-1
2 unsigned short 0~65 535\pm6萬 0~216-1
3 unsigned int 0~4 294 967 295\pm43億 0~232-1
4 unsigned long long 0~18 446 744 073 709 551 615 0~264-1

類型的表示范圍與類型大小存在如下關系:
0 \sim 2^n-1
其中,n是類型大小。

輸入輸出無符號整型格式

No. 類型 占位符
1 char %u
2 short %hu
3 int %u
4 long %lu
5 long long %llu

2.3 整型類型選擇

整型類型很多,通常遵循下面的使用規則:

  1. 大多數情況下使用int
  2. 如果int范圍不夠,使用long long
  3. 避免使用long
  4. 謹慎使用unsigned

3. 浮點類型

3.1 浮點數的范圍

運行下面程序,分析執行結果:

#include <stdio.h>

int main(){
    printf("1.0/0.0  = %f\n",1.0/0.0);
    printf("-1.0/0.0 = %f\n",-1.0/0.0);
    printf("0.0/0.0  = %f\n",0.0/0.0);
    return 0;
}

當浮點數超出可表示的范圍,會有如下值。

No. 輸出 含義
1 inf 表示正無窮大
2 -inf 表示負無窮大
3 nan 不存在

3.2 浮點數的精度

  • 設計上的精度問題
    運行下面程序,分析執行結果:
#include <stdio.h>

int main(){
    float  f = 123456789.0;
    double d = 123456789.0;
    printf("f=%f\n" ,f);
    printf("d=%lf\n",d);
    return 0;
}

計算機浮點數存在精度問題。

No. 類型 數字范圍 有效數字
1 float -3.4E+38~3.4E+38 6~7
2 double -1.7E-3081.7E+308 15~16
3 long double -1.2E-4932~1.2E+4932 18~19

注意:浮點類型沒有無符號unsigned類型。

  • 運算中的精度問題
    運行下面程序,分析執行結果:
#include <stdio.h>

int main(){
   float a = 10.2;  
   float b = 9;  
   float c = a - b;
   printf("%f - %f = %f\n", a,b,c);  
   return 0;
}

上面結果看似正確,把程序改成如下:

#include <stdio.h>

int main(){
   float a = 10.2;  
   float b = 9;  
   float c = a - b;
   if(c == 1.2){
       printf("%f == 1.2",c);
   }else{
       printf("%f != 1.2",c);
   }
   return 0;
}

以7位有效數組打印運算結果。

#include <stdio.h>

int main(){
   float a = 10.2;  
   float b = 9;  
   float c = a - b;
   printf("%.7f - %.7f = %.7f\n", a,b,c);  
   return 0;
}

發現運算中存在精度缺失。
如何比較浮點數?使用最小誤差。

#include <stdio.h>
    
int main(){
   float a = 10.2;  
   float b = 9;  
   float c = a - b;
   if(fabs(c - 1.2) < 0.000001){
       printf("%f == 1.2\n",c);
   }else{
       printf("%f != 1.2\n",c);
   }
    
   return 0;
}

在誤差范圍內認為相等。即絕對值差小于精度最小值。
float浮點數誤差通常為10{^-6}(6位有效數字)。
double浮點數誤差通常為10^{-15}(15位有效數字)。

3.3 浮點類型選擇

浮點類型有三種,通常遵循下面的使用規則:

  1. 大多數情況下使用double
  2. 盡量不要使用float
  3. 過程運算可以使用long double

問題

  • 既然浮點數這么不準確,為什么還需要?
    浮點數通過損失精度,獲取更大的表示范圍。
  • 試一試:整數除以零會有什么結果
#include <stdio.h>

int main(){
    printf("1/0  = %d\n",1/0);
    return 0;
}

4. 字符類型

字符類型是一個特殊類型,是整型的一種。使用單引號表示字符字面量,例如:字母'a'、數字'1'、空字符''、轉義字符\n
通常使用%c作為格式化占位符輸入輸出,有時也可以使用%d輸出字符對應ASCII編碼。

  • 打印字符
#include <stdio.h>

int main(){
    char c='1';
    printf("%c\n%d\n",c,c);
    return 0;
}

4.1 ASCII編碼

ASCII編碼使用7 位二進制數(剩下的1位二進制為0)來表示所有的大寫和小寫字母,數字0 到9、標點符號, 以及在美式英語中使用的特殊控制字符。



ASCII表的特點:

  1. 字母在ASCII表中是順序排列的。
  2. 大寫字母和小寫字母是分開排列的。

C語言中字符即數字。

printf("%d\n",'a');
printf("%c\n",97);

4.2 運算

  1. 字符類型可以像整型一樣參與運算。
    例如:
#include <stdio.h>

int main(){
    char a='a';
    printf("%c\n%c\n",a,a+1);
    return 0;
}

字符類型操作含義:

  • 一個字符加上一個數字得到ASCII表中對應新字符。
  • 兩個字符相減,得到這兩個字符在表中的距離。

實例:

  1. 分別打印出26個大寫字母和小寫字母。
  2. 把一個字符串整型數字轉化成整型數字。例如:"1234"轉發成1234
  3. 判斷一個字符串是否存在滿足標識符命名規則。
  4. 大小寫轉換

4.3 轉義字符/逃逸字符

在ASCII表中,除了常見的字符(如:大小寫字母、數字等),還包含一些無法打印出來的控制字符或特殊字符。這些字符以反斜線\開頭,后面接著一個字符,這種字符被稱作轉義字符/逃逸字符。

  • 常用的轉義字符/逃逸字符
字符 含義 字符 含義
\' 單引號 \" 雙引號
\r 回車 \n 換行
\b 退格符 \f 翻頁符
\t 表格符 \\ 反斜線符

5. 布爾類型

在C99中新增bool類型表示邏輯值,它只有兩種值(truefalse)。使用前需要加上頭文件stdbool.h


6. 數據轉換

6.1 自動類型轉換

當運算符左右兩邊操作數的類型不一致時,會自動轉換成較大類型。

  • 整型:charshortintlonglong long
  • 浮點型:intfloatdoublelong double

6.2 強制類型轉換

當把一個較大的類型轉換成較小的類型,需要強制轉換。

強制轉換語法

(轉換后的類型)值

例如:

printf("%d\n",(int)3.14);

有時,整型轉浮點型也需要強制轉換。
例如:

printf("%f\n",(double)1/2);

其中,浮點數轉整數采用的是截斷方式。

7.練習

  1. 下面代碼輸出結果
int main(){
    for(char i =0; i < 256; ++i){
        printf("%d\n", i);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容