2. 數據類型
2.1 常量與變量
2.1.1 關鍵字

2.1.2 數據類型
數據類型的作用:編譯器預算對象(變量)分配的內存空間大小。

2.1.3 常量
常量:
l 在程序運行過程中,其值不能被改變的量
l 常量一般出現在表達式或賦值語句中
| 整型常量 |
100,200,-100,0 |
| 實型常量 |
3.14 , 0.125,-3.123 |
| 字符型常量 |
‘a’,‘b’,‘1’,‘\n’ |
| 字符串常量 |
“a”,“ab”,“12356” |
2.1.4 變量
1) 變量
變量:
l 在程序運行過程中,其值可以改變
l 變量在使用前必須先定義,定義變量前必須有相應的數據類型
標識符命名規則:
l 標識符不能是關鍵字
l 標識符只能由字母、數字、下划線組成
l 第一個字符必須為字母或下划線
l 標識符中字母區分大小寫
變量特點:
l 變量在編譯時為其分配相應的內存空間
l 可以通過其名字和地址訪問相應內存
2) 聲明和定義區別
l 聲明變量不需要建立存儲空間,如:extern int a;
l 定義變量需要建立存儲空間,如:int b;
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 //extern 關鍵字只做聲明,不能做任何定義,后面還會學習,這里先了解 10 11 //聲明一個變量a,a在這里沒有建立存儲空間 12 13 extern int a; 14 15 a = 10; //err, 沒有空間,就不可以賦值 16 17 18 19 int b = 10; //定義一個變量b,b的類型為int,b賦值為10 20 21 22 23 return 0; 24 25 }
從廣義的角度來講聲明中包含着定義,即定義是聲明的一個特例,所以並非所有的聲明都是定義:
l int b 它既是聲明,同時又是定義
l 對於 extern b來講它只是聲明不是定義
一般的情況下,把建立存儲空間的聲明稱之為“定義”,而把不需要建立存儲空間的聲明稱之為“聲明”。
2.1.5 使用示例
1 #include <stdio.h> 2 3 #define MAX 10 //聲明了一個常量,名字叫MAX,值是10,常量的值一旦初始化不可改 4 5 6 7 int main() 8 9 { 10 11 int a; //定義了一個變量,其類型為int,名字叫a 12 13 14 15 const int b = 10; //定義一個const常量,名為叫b,值為10 16 17 //b = 11; //err,常量的值不能改變 18 19 20 21 //MAX = 100; //err,常量的值不能改變 22 23 24 25 a = MAX;//將abc的值設置為MAX的值 26 27 a = 123; 28 29 30 31 printf("%d\n", a); //打印變量a的值 32 33 34 35 return 0; 36 37 } 38 39
2.2 進制
進制也就是進位制,是人們規定的一種進位方法。 對於任何一種進制—X進制,就表示某一位置上的數運算時是逢X進一位。 十進制是逢十進一,十六進制是逢十六進一,二進制就是逢二進一,以此類推,x進制就是逢x進位。
| 十進制 |
二進制 |
八進制 |
十六進制 |
| 0 |
0 |
0 |
0 |
| 1 |
1 |
1 |
1 |
| 2 |
10 |
2 |
2 |
| 3 |
11 |
3 |
3 |
| 4 |
100 |
4 |
4 |
| 5 |
101 |
5 |
5 |
| 6 |
110 |
6 |
6 |
| 7 |
111 |
7 |
7 |
| 8 |
1000 |
10 |
8 |
| 9 |
1001 |
11 |
9 |
| 10 |
1010 |
12 |
A |
| 11 |
1011 |
13 |
B |
| 12 |
1100 |
14 |
C |
| 13 |
1101 |
15 |
D |
| 14 |
1110 |
16 |
E |
| 15 |
1111 |
17 |
F |
| 16 |
10000 |
20 |
10 |
2.2.1 二進制
二進制是計算技術中廣泛采用的一種數制。二進制數據是用0和1兩個數碼來表示的數。它的基數為2,進位規則是“逢二進一”,借位規則是“借一當二”。
當前的計算機系統使用的基本上是二進制系統,數據在計算機中主要是以補碼的形式存儲的。
| 術語 |
含義 |
| bit(比特) |
一個二進制代表一位,一個位只能表示0或1兩種狀態。數據傳輸是習慣以“位”(bit)為單位。 |
| Byte(字節) |
一個字節為8個二進制,稱為8位,計算機中存儲的最小單位是字節。數據存儲是習慣以“字節”(Byte)為單位。 |
| WORD(雙字節) |
2個字節,16位 |
| DWORD |
兩個WORD,4個字節,32位 |
| 1b |
1bit,1位 |
| 1B |
1Byte,1字節,8位 |
| 1k,1K |
1024 |
| 1M(1兆) |
1024k, 1024*1024 |
| 1G |
1024M |
| 1T |
1024G |
| 1Kb(千位) |
1024bit,1024位 |
| 1KB(千字節) |
1024Byte,1024字節 |
| 1Mb(兆位) |
1024Kb = 1024 * 1024bit |
| 1MB(兆字節) |
1024KB = 1024 * 1024Byte |
十進制轉化二進制的方法:用十進制數除以2,分別取余數和商數,商數為0的時候,將余數倒着數就是轉化后的結果。
十進制的小數轉換成二進制:小數部分和2相乘,取整數,不足1取0,每次相乘都是小數部分,順序看取整后的數就是轉化后的結果。
2.2.2 八進制
八進制,Octal,縮寫OCT或O,一種以8為基數的計數法,采用0,1,2,3,4,5,6,7八個數字,逢八進1。一些編程語言中常常以數字0開始表明該數字是八進制。
八進制的數和二進制數可以按位對應(八進制一位對應二進制三位),因此常應用在計算機語言中。
十進制轉化八進制的方法:
用十進制數除以8,分別取余數和商數,商數為0的時候,將余數倒着數就是轉化后的結果。
2.2.3 十六進制
十六進制(英文名稱:Hexadecimal),同我們日常生活中的表示法不一樣,它由0-9,A-F組成,字母不區分大小寫。與10進制的對應關系是:0-9對應0-9,A-F對應10-15。
十六進制的數和二進制數可以按位對應(十六進制一位對應二進制四位),因此常應用在計算機語言中。
十進制轉化十六進制的方法:
用十進制數除以16,分別取余數和商數,商數為0的時候,將余數倒着數就是轉化后的結果。
2.2.4 C語言如何表示相應進制數
| 十進制 |
以正常數字1-9開頭,如123 |
| 八進制 |
以數字0開頭,如0123 |
| 十六進制 |
以0x開頭,如0x123 |
| 二進制 |
C語言不能直接書寫二進制數 |
1 2 3 #include <stdio.h> 4 5 6 7 int main() 8 9 { 10 11 int a = 123; //十進制方式賦值 12 13 int b = 0123; //八進制方式賦值, 以數字0開頭 14 15 int c = 0xABC; //十六進制方式賦值 16 17 18 19 //如果在printf中輸出一個十進制數那么用%d,八進制用%o,十六進制是%x 20 21 printf("十進制:%d\n",a ); 22 23 printf("八進制:%o\n", b); //%o,為字母o,不是數字 24 25 printf("十六進制:%x\n", c); 26 27 28 29 return 0; 30 31 } 32 33
2.3 計算機內存數值存儲方式
2.3.1 原碼
一個數的原碼(原始的二進制碼)有如下特點:
l 最高位做為符號位,0表示正,為1表示負
l 其它數值部分就是數值本身絕對值的二進制數
l 負數的原碼是在其絕對值的基礎上,最高位變為1
下面數值以1字節的大小描述:
| 十進制數 |
原碼 |
| +15 |
0000 1111 |
| -15 |
1000 1111 |
| +0 |
0000 0000 |
| -0 |
1000 0000 |
原碼表示法簡單易懂,與帶符號數本身轉換方便,只要符號還原即可,但當兩個正數相減或不同符號數相加時,必須比較兩個數哪個絕對值大,才能決定誰減誰,才能確定結果是正還是負,所以原碼不便於加減運算。
2.3.2 反碼
l 對於正數,反碼與原碼相同
l 對於負數,符號位不變,其它部分取反(1變0,0變1)
| 十進制數 |
反碼 |
| +15 |
0000 1111 |
| -15 |
1111 0000 |
| +0 |
0000 0000 |
| -0 |
1111 1111 |
反碼運算也不方便,通常用來作為求補碼的中間過渡。
2.3.3 補碼
在計算機系統中,數值一律用補碼來存儲。
補碼特點:
l 對於正數,原碼、反碼、補碼相同
l 對於負數,其補碼為它的反碼加1
l 補碼符號位不動,其他位求反,最后整個數加1,得到原碼
| 十進制數 |
補碼 |
| +15 |
0000 1111 |
| -15 |
1111 0001 |
| +0 |
0000 0000 |
| -0 |
0000 0000 |
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 int a = -15; 10 11 12 13 printf("%x\n", a); 14 15 //結果為 fffffff1 16 17 //fffffff1對應的二進制:1111 1111 1111 1111 1111 1111 1111 0001 18 19 //符號位不變,其它取反:1000 0000 0000 0000 0000 0000 0000 1110 20 21 //上面加1:1000 0000 0000 0000 0000 0000 0000 1111 最高位1代表負數,就是-15 22 23 24 25 return 0; 26 27 } 28 29
2.3.4 補碼的意義
示例1:用8位二進制數分別表示+0和-0
| 十進制數 |
原碼 |
| +0 |
0000 0000 |
| -0 |
1000 0000 |
| 十進制數 |
反碼 |
| +0 |
0000 0000 |
| -0 |
1111 1111 |
不管以原碼方式存儲,還是以反碼方式存儲,0也有兩種表示形式。為什么同樣一個0有兩種不同的表示方法呢?
但是如果以補碼方式存儲,補碼統一了零的編碼:
| 十進制數 |
補碼 |
| +0 |
0000 0000 |
| -0 |
10000 0000由於只用8位描述,最高位1丟棄,變為0000 0000 |
示例2:計算9-6的結果
以原碼方式相加:
| 十進制數 |
原碼 |
| 9 |
0000 1001 |
| -6 |
1000 0110 |
結果為-15,不正確。
以補碼方式相加:
| 十進制數 |
補碼 |
| 9 |
0000 1001 |
| -6 |
1111 1010 |
最高位的1溢出,剩余8位二進制表示的是3,正確。
在計算機系統中,數值一律用補碼來存儲,主要原因是:
l 統一了零的編碼
l 將符號位和其它位統一處理
l 將減法運算轉變為加法運算
l 兩個用補碼表示的數相加時,如果最高位(符號位)有進位,則進位被舍棄
2.4 sizeof關鍵字
l sizeof不是函數,所以不需要包含任何頭文件,它的功能是計算一個數據類型的大小,單位為字節
l sizeof的返回值為size_t
l size_t類型在32位操作系統下是unsigned int,是一個無符號的整數
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 int a; 10 11 int b = sizeof(a);//sizeof得到指定值占用內存的大小,單位:字節 12 13 printf("b = %d\n", b); 14 15 16 17 size_t c = sizeof(a); 18 19 printf("c = %u\n", c);//用無符號數的方式輸出c的值 20 21 22 23 return 0; 24 25 }
2.5整型:int
2.5.1 整型變量的定義和輸出
| 打印格式 |
含義 |
| %d |
輸出一個有符號的10進制int類型 |
| %o(字母o) |
輸出8進制的int類型 |
| %x |
輸出16進制的int類型,字母以小寫輸出 |
| %X |
輸出16進制的int類型,字母以大寫寫輸出 |
| %u |
輸出一個10進制的無符號數 |
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 int a = 123; //定義變量a,以10進制方式賦值為123 10 11 int b = 0567; //定義變量b,以8進制方式賦值為0567 12 13 int c = 0xabc; //定義變量c,以16進制方式賦值為0xabc 14 15 16 17 printf("a = %d\n", a); 18 19 printf("8進制:b = %o\n", b); 20 21 printf("10進制:b = %d\n", b); 22 23 printf("16進制:c = %x\n", c); 24 25 printf("16進制:c = %X\n", c); 26 27 printf("10進制:c = %d\n", c); 28 29 30 31 unsigned int d = 0xffffffff; //定義無符號int變量d,以16進制方式賦值 32 33 printf("有符號方式打印:d = %d\n", d); 34 35 printf("無符號方式打印:d = %u\n", d); 36 37 return 0; 38 39 }
2.5.2 整型變量的輸入
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 int a; 10 11 printf("請輸入a的值:"); 12 13 14 15 //不要加“\n” 16 17 scanf("%d", &a); 18 19 20 21 printf("a = %d\n", a); //打印a的值 22 23 24 25 return 0; 26 27 }
2.5.3 short、int、long、long long
| 數據類型 |
占用空間 |
| short(短整型) |
2字節 |
| int(整型) |
4字節 |
| long(長整形) |
Windows為4字節,Linux為4字節(32位),8字節(64位) |
| long long(長長整形) |
8字節 |
注意:
l 需要注意的是,整型數據在內存中占的字節數與所選擇的操作系統有關。雖然 C 語言標准中沒有明確規定整型數據的長度,但 long 類型整數的長度不能短於 int 類型, short 類型整數的長度不能短於 int 類型。
l 當一個小的數據類型賦值給一個大的數據類型,不會出錯,因為編譯器會自動轉化。但當一個大的類型賦值給一個小的數據類型,那么就可能丟失高位。
| 整型常量 |
所需類型 |
| 10 |
代表int類型 |
| 10l, 10L |
代表long類型 |
| 10ll, 10LL |
代表long long類型 |
| 10u, 10U |
代表unsigned int類型 |
| 10ul, 10UL |
代表unsigned long類型 |
| 10ull, 10ULL |
代表unsigned long long類型 |
| 打印格式 |
含義 |
| %hd |
輸出short類型 |
| %d |
輸出int類型 |
| %l |
輸出long類型 |
| %ll |
輸出long long類型 |
| %hu |
輸出unsigned short類型 |
| %u |
輸出unsigned int類型 |
| %lu |
輸出unsigned long類型 |
| %llu |
輸出unsigned long long類型 |
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 short a = 10; 10 11 int b = 10; 12 13 long c = 10l; //或者10L 14 15 long long d = 10ll; //或者10LL 16 17 18 19 printf("sizeof(a) = %u\n", sizeof(a)); 20 21 printf("sizeof(b) = %u\n", sizeof(b)); 22 23 printf("sizeof(c) = %u\n", sizeof(c)); 24 25 printf("sizeof(c) = %u\n", sizeof(d)); 26 27 28 29 printf("short a = %hd\n", a); 30 31 printf("int b = %d\n", b); 32 33 printf("long c = %ld\n", c); 34 35 printf("long long d = %lld\n", d); 36 37 38 39 unsigned short a2 = 20u; 40 41 unsigned int b2 = 20u; 42 43 unsigned long c2= 20ul; 44 45 unsigned long long d2 = 20ull; 46 47 48 49 printf("unsigned short a = %hu\n", a2); 50 51 printf("unsigned int b = %u\n", b2); 52 53 printf("unsigned long c = %lu\n", c2); 54 55 printf("unsigned long long d = %llu\n", d2); 56 57 58 59 return 0; 60 61 } 62 63
2.5.4 有符號數和無符號數區別
1) 有符號數
有符號數是最高位為符號位,0代表正數,1代表負數。
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 signed int a = -1089474374; //定義有符號整型變量a 10 11 printf("%X\n", a); //結果為 BF0FF0BA 12 13 14 15 //B F 0 F F 0 B A 16 17 //1011 1111 0000 1111 1111 0000 1011 1010 18 19 20 21 return 0; 22 23 } 24 25
2) 無符號數
無符號數最高位不是符號位,而就是數的一部分,無符號數不可能是負數。
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 unsigned int a = 3236958022; //定義無符號整型變量a 10 11 printf("%X\n", a); //結果為 C0F00F46 12 13 14 15 return 0; 16 17 }
當我們寫程序要處理一個不可能出現負值的時候,一般用無符號數,這樣可以增大數的表達最大值。
3) 有符號和無符號整型取值范圍
| 數據類型 |
占用空間 |
取值范圍 |
| short |
2字節 |
-32768 到 32767 (-215 ~ 215-1) |
| int |
4字節 |
-2147483648 到 2147483647 (-231 ~ 231-1) |
| long |
4字節 |
-2147483648 到 2147483647 (-231 ~ 231-1) |
| unsigned short |
2字節 |
0 到 65535 (0 ~ 216-1) |
| unsigned int |
4字節 |
0 到 4294967295 (0 ~ 232-1) |
| unsigned long |
4字節 |
0 到 4294967295 (0 ~ 232-1) |
2.6字符型:char
2.6.1 字符變量的定義和輸出
字符型變量用於存儲一個單一字符,在 C 語言中用 char 表示,其中每個字符變量都會占用 1 個字節。在給字符型變量賦值時,需要用一對英文半角格式的單引號(' ')把字符括起來。
字符變量實際上並不是把該字符本身放到變量的內存單元中去,而是將該字符對應的 ASCII 編碼放到變量的存儲單元中。char的本質就是一個1字節大小的整型。
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 char ch = 'a'; 10 11 printf("sizeof(ch) = %u\n", sizeof(ch)); 12 13 14 15 printf("ch[%%c] = %c\n", ch); //打印字符 16 17 printf("ch[%%d] = %d\n", ch); //打印‘a’ ASCII的值 18 19 20 21 char A = 'A'; 22 23 char a = 'a'; 24 25 printf("a = %d\n", a); //97 26 27 printf("A = %d\n", A); //65 28 29 30 31 printf("A = %c\n", 'a' - 32); //小寫a轉大寫A 32 33 printf("a = %c\n", 'A' + 32); //大寫A轉小寫a 34 35 36 37 ch = ' '; 38 39 printf("空字符:%d\n", ch); //空字符ASCII的值為32 40 41 printf("A = %c\n", 'a' - ' '); //小寫a轉大寫A 42 43 printf("a = %c\n", 'A' + ' '); //大寫A轉小寫a 44 45 46 47 return 0; 48 49 } 50 51
2.6.2 字符變量的輸入
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 char ch; 10 11 printf("請輸入ch的值:"); 12 13 14 15 //不要加“\n” 16 17 scanf("%c", &ch); 18 19 printf("ch = %c\n", ch); //打印ch的字符 20 21 22 23 return 0; 24 25 }
2.6.2 ASCII對照表
| ASCII值 |
控制字符 |
ASCII值 |
字符 |
ASCII值 |
字符 |
ASCII值 |
字符 |
| 0 |
NUT |
32 |
(space) |
64 |
@ |
96 |
、 |
| 1 |
SOH |
33 |
! |
65 |
A |
97 |
a |
| 2 |
STX |
34 |
" |
66 |
B |
98 |
b |
| 3 |
ETX |
35 |
# |
67 |
C |
99 |
c |
| 4 |
EOT |
36 |
$ |
68 |
D |
100 |
d |
| 5 |
ENQ |
37 |
% |
69 |
E |
101 |
e |
| 6 |
ACK |
38 |
& |
70 |
F |
102 |
f |
| 7 |
BEL |
39 |
, |
71 |
G |
103 |
g |
| 8 |
BS |
40 |
( |
72 |
H |
104 |
h |
| 9 |
HT |
41 |
) |
73 |
I |
105 |
i |
| 10 |
LF |
42 |
* |
74 |
J |
106 |
j |
| 11 |
VT |
43 |
+ |
75 |
K |
107 |
k |
| 12 |
FF |
44 |
, |
76 |
L |
108 |
l |
| 13 |
CR |
45 |
- |
77 |
M |
109 |
m |
| 14 |
SO |
46 |
. |
78 |
N |
110 |
n |
| 15 |
SI |
47 |
/ |
79 |
O |
111 |
o |
| 16 |
DLE |
48 |
0 |
80 |
P |
112 |
p |
| 17 |
DCI |
49 |
1 |
81 |
Q |
113 |
q |
| 18 |
DC2 |
50 |
2 |
82 |
R |
114 |
r |
| 19 |
DC3 |
51 |
3 |
83 |
S |
115 |
s |
| 20 |
DC4 |
52 |
4 |
84 |
T |
116 |
t |
| 21 |
NAK |
53 |
5 |
85 |
U |
117 |
u |
| 22 |
SYN |
54 |
6 |
86 |
V |
118 |
v |
| 23 |
TB |
55 |
7 |
87 |
W |
119 |
w |
| 24 |
CAN |
56 |
8 |
88 |
X |
120 |
x |
| 25 |
EM |
57 |
9 |
89 |
Y |
121 |
y |
| 26 |
SUB |
58 |
: |
90 |
Z |
122 |
z |
| 27 |
ESC |
59 |
; |
91 |
[ |
123 |
{ |
| 28 |
FS |
60 |
< |
92 |
/ |
124 |
| |
| 29 |
GS |
61 |
= |
93 |
] |
125 |
} |
| 30 |
RS |
62 |
> |
94 |
^ |
126 |
` |
| 31 |
US |
63 |
? |
95 |
_ |
127 |
DEL |
ASCII 碼大致由以下兩部分組成:
l ASCII 非打印控制字符: ASCII 表上的數字 0-31 分配給了控制字符,用於控制像打印機等一些外圍設備。
l ASCII 打印字符:數字 32-126 分配給了能在鍵盤上找到的字符,當查看或打印文檔時就會出現。數字 127 代表 Del 命令。
2.6.3 轉義字符
| 轉義字符 |
含義 |
ASCII碼值(十進制) |
| \a |
警報 |
007 |
| \b |
退格(BS) ,將當前位置移到前一列 |
008 |
| \f |
換頁(FF),將當前位置移到下頁開頭 |
012 |
| \n |
換行(LF) ,將當前位置移到下一行開頭 |
010 |
| \r |
回車(CR) ,將當前位置移到本行開頭 |
013 |
| \t |
水平制表(HT) (跳到下一個TAB位置) |
009 |
| \v |
垂直制表(VT) |
011 |
| \\ |
代表一個反斜線字符"\" |
092 |
| \' |
代表一個單引號(撇號)字符 |
039 |
| \" |
代表一個雙引號字符 |
034 |
| \? |
代表一個問號 |
063 |
| \0 |
數字0 |
000 |
| \ddd |
8進制轉義字符,d范圍0~7 |
3位8進制 |
| \xhh |
16進制轉義字符,h范圍0~9,a~f,A~F |
3位16進制 |
注意:紅色字體標注的為不可打印字符。
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 printf("abc"); 10 11 printf("\refg\n"); //\r切換到句首, \n為換行鍵 12 13 14 15 printf("abc"); 16 17 printf("\befg\n");//\b為退格鍵, \n為換行鍵 18 19 20 21 printf("%d\n", '\123');// '\123'為8進制轉義字符,0123對應10進制數為83 22 23 printf("%d\n", '\x23');// '\x23'為16進制轉義字符,0x23對應10進制數為35 24 25 26 27 return 0; 28 29 }
2.6.4 數值溢出
當超過一個數據類型能夠存放最大的范圍時,數值會溢出。
有符號位最高位溢出的區別:符號位溢出會導致數的正負發生改變,但最高位的溢出會導致最高位丟失。
| 數據類型 |
占用空間 |
取值范圍 |
| char |
1字節 |
-128到 127(-27 ~ 27-1) |
| unsigned char |
1字節 |
0 到 255(0 ~ 28-1) |
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 char ch; 10 11 12 13 //符號位溢出會導致數的正負發生改變 14 15 ch = 0x7f + 2; //127+2 16 17 printf("%d\n", ch); 18 19 // 0111 1111 20 21 //+2后 1000 0001,這是負數補碼,其原碼為 1111 1111,結果為-127 22 23 24 25 //最高位的溢出會導致最高位丟失 26 27 unsigned char ch2; 28 29 ch2 = 0xff+1; //255+1 30 31 printf("%u\n", ch2); 32 33 // 1111 1111 34 35 //+1后 10000 0000, char只有8位最高位的溢出,結果為0000 0000,十進制為0 36 37 38 39 ch2 = 0xff + 2; //255+1 40 41 printf("%u\n", ch2); 42 43 // 1111 1111 44 45 //+1后 10000 0001, char只有8位最高位的溢出,結果為0000 0001,十進制為1 46 47 48 49 return 0; 50 51 } 52 53
2.7實型(浮點型):float、double
實型變量也可以稱為浮點型變量,浮點型變量是用來存儲小數數值的。在C語言中, 浮點型變量分為兩種: 單精度浮點數(float)、 雙精度浮點數(double), 但是double型變量所表示的浮點數比 float 型變量更精確。
| 數據類型 |
占用空間 |
有效數字范圍 |
| float |
4字節 |
7位有效數字 |
| double |
8字節 |
15~16位有效數字 |
由於浮點型變量是由有限的存儲單元組成的,因此只能提供有限的有效數字。在有效位以外的數字將被舍去,這樣可能會產生一些誤差。
不以f結尾的常量是double類型,以f結尾的常量(如3.14f)是float類型。
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 //傳統方式賦值 10 11 float a = 3.14f; //或3.14F 12 13 double b = 3.14; 14 15 16 17 printf("a = %f\n", a); 18 19 printf("b = %lf\n", b); 20 21 22 23 //科學法賦值 24 25 a = 3.2e3f; //3.2*1000 = 32000,e可以寫E 26 27 printf("a1 = %f\n", a); 28 29 30 31 a = 100e-3f; //100*0.001 = 0.1 32 33 printf("a2 = %f\n", a); 34 35 36 37 a = 3.1415926f; 38 39 printf("a3 = %f\n", a); //結果為3.141593 40 41 42 43 return 0; 44 45 } 46 47
2.8類型限定符
| 限定符 |
含義 |
| extern |
聲明一個變量,extern聲明的變量沒有建立存儲空間。 extern int a; |
| const |
定義一個常量,常量的值不能修改。 const int a = 10; |
| volatile |
防止編譯器優化代碼 |
| register |
定義寄存器變量,提高效率。register是建議型的指令,而不是命令型的指令,如果CPU有空閑寄存器,那么register就生效,如果沒有空閑寄存器,那么register無效。 |
2.9字符串格式化輸出和輸入
2.9.1 字符串常量
l 字符串是內存中一段連續的char空間,以'\0'(數字0)結尾。
l 字符串常量是由雙引號括起來的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
字符串常量與字符常量的不同:
每個字符串的結尾,編譯器會自動的添加一個結束標志位'\0',即 "a" 包含兩個字符'a'和’\0’。
2.9.2 printf函數和putchar函數
printf是輸出一個字符串,putchar輸出一個char。
printf格式字符:
| 打印格式 |
對應數據類型 |
含義 |
| %d |
int |
接受整數值並將它表示為有符號的十進制整數 |
| %hd |
short int |
短整數 |
| %hu |
unsigned short |
無符號短整數 |
| %o |
unsigned int |
無符號8進制整數 |
| %u |
unsigned int |
無符號10進制整數 |
| %x,%X |
unsigned int |
無符號16進制整數,x對應的是abcdef,X對應的是ABCDEF |
| %f |
float |
單精度浮點數 |
| %lf |
double |
雙精度浮點數 |
| %e,%E |
double |
科學計數法表示的數,此處"e"的大小寫代表在輸出時用的"e"的大小寫 |
| %c |
char |
字符型。可以把輸入的數字按照ASCII碼相應轉換為對應的字符 |
| %s |
char * |
字符串。輸出字符串中的字符直至字符串中的空字符(字符串以'\0‘結尾,這個'\0'即空字符) |
| %p |
void * |
以16進制形式輸出指針 |
| %% |
% |
輸出一個百分號 |
printf附加格式:
| 字符 |
含義 |
| l(字母l) |
附加在d,u,x,o前面,表示長整數 |
| - |
左對齊 |
| m(代表一個整數) |
數據最小寬度 |
| 0(數字0) |
將輸出的前面補上0直到占滿指定列寬為止不可以搭配使用- |
| m.n(代表一個整數) |
m指域寬,即對應的輸出項在輸出設備上所占的字符數。n指精度,用於說明輸出的實型數的小數位數。對數值型的來說,未指定n時,隱含的精度為n=6位。 |
1 #include <stdio.h> 2 3 int main() 4 5 { 6 7 int a = 100; 8 9 printf("a = %d\n", a);//格式化輸出一個字符串 10 11 printf("%p\n", &a);//輸出變量a在內存中的地址編號 12 13 printf("%%d\n"); 14 15 16 17 char c = 'a'; 18 19 putchar(c);//putchar只有一個參數,就是要輸出的char 20 21 long a2 = 100; 22 23 printf("%ld, %lx, %lo\n", a2, a2, a2); 24 25 26 27 long long a3 = 1000; 28 29 printf("%lld, %llx, %llo\n", a3, a3, a3); 30 31 32 33 int abc = 10; 34 35 printf("abc = '%6d'\n", abc); 36 37 printf("abc = '%-6d'\n", abc); 38 39 printf("abc = '%06d'\n", abc); 40 41 printf("abc = '%-06d'\n", abc); 42 43 44 45 double d = 12.3; 46 47 printf("d = \' %-10.3lf \'\n", d); 48 49 50 51 return 0; 52 53 }
2.9.3 scanf函數與getchar函數
l getchar是從標准輸入設備讀取一個char。
l scanf通過%轉義的方式可以得到用戶通過標准輸入設備輸入的數據。
1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 char ch1; 10 11 char ch2; 12 13 char ch3; 14 15 int a; 16 17 int b; 18 19 20 21 printf("請輸入ch1的字符:"); 22 23 ch1 = getchar(); 24 25 printf("ch1 = %c\n", ch1); 26 27 28 29 getchar(); //測試此處getchar()的作用 30 31 32 33 printf("請輸入ch2的字符:"); 34 35 ch2 = getchar(); 36 37 printf("\'ch2 = %ctest\'\n", ch2); 38 39 40 41 getchar(); //測試此處getchar()的作用 42 43 printf("請輸入ch3的字符:"); 44 45 scanf("%c", &ch3);//這里第二個參數一定是變量的地址,而不是變量名 46 47 printf("ch3 = %c\n", ch3); 48 49 50 51 printf("請輸入a的值:"); 52 53 scanf("%d", &a); 54 55 printf("a = %d\n", a); 56 57 58 59 printf("請輸入b的值:"); 60 61 scanf("%d", &b); 62 63 printf("b = %d\n", b); 64 65 66 67 return 0; 68 69 }
| 十進制代碼 |
十六進制代碼 |
MCS 字符或縮寫 |
DEC 多國字符名 |
| ASCII 控制字符 1 |
|||
| 0 |
0 |
NUL |
空字符 |
| 1 |
1 |
SOH |
標題起始 (Ctrl/A) |
| 2 |
2 |
STX |
文本起始 (Ctrl/B) |
| 3 |
3 |
ETX |
文本結束 (Ctrl/C) |
| 4 |
4 |
EOT |
傳輸結束 (Ctrl/D) |
| 5 |
5 |
ENQ |
詢問 (Ctrl/E) |
| 6 |
6 |
ACK |
認可 (Ctrl/F) |
| 7 |
7 |
BEL |
鈴 (Ctrl/G) |
| 8 |
8 |
BS |
退格 (Ctrl/H) |
| 9 |
9 |
HT |
水平制表欄 (Ctrl/I) |
| 10 |
0A |
LF |
換行 (Ctrl/J) |
| 11 |
0B |
VT |
垂直制表欄 (Ctrl/K) |
| 12 |
0C |
FF |
換頁 (Ctrl/L) |
| 13 |
0D |
CR |
回車 (Ctrl/M) |
| 14 |
0E |
SO |
移出 (Ctrl/N) |
| 15 |
0F |
SI |
移入 (Ctrl/O) |
| 16 |
10 |
DLE |
數據鏈接丟失 (Ctrl/P) |
| 17 |
11 |
DC1 |
設備控制 1 (Ctrl/Q) |
| 18 |
12 |
DC2 |
設備控制 2 (Ctrl/R) |
| 19 |
13 |
DC3 |
設備控制 3 (Ctrl/S) |
| 20 |
14 |
DC4 |
設備控制 4 (Ctrl/T) |
| 21 |
15 |
NAK |
否定接受 (Ctrl/U) |
| 22 |
16 |
SYN |
同步閑置符 (Ctrl/V) |
| 23 |
17 |
ETB |
傳輸塊結束 (Ctrl/W) |
| 24 |
18 |
CAN |
取消 (Ctrl/X) |
| 25 |
19 |
EM |
媒體結束 (Ctrl/Y) |
| 26 |
1A |
SUB |
替換 (Ctrl/Z) |
| 27 |
1B |
ESC |
換碼符 |
| 28 |
1C |
FS |
文件分隔符 |
| 29 |
1D |
GS |
組分隔符 |
| 30 |
1E |
RS |
記錄分隔符 |
| 31 |
1F |
US |
單位分隔符 |
| ASCII 特殊和數字字符 |
|||
| 32 |
20 |
SP |
空格 |
| 33 |
21 |
! |
感嘆號 |
| 34 |
22 |
" |
引號 (雙引號) |
| 35 |
23 |
# |
數字符號 |
| 36 |
24 |
$ |
美元符 |
| 37 |
25 |
% |
百分號 |
| 38 |
26 |
& |
和號 |
| 39 |
27 |
' |
省略號 (單引號) |
| 40 |
28 |
( |
左圓括號 |
| 41 |
29 |
) |
右圓括號 |
| 42 |
2A |
* |
星號 |
| 43 |
2B |
+ |
加號 |
| 44 |
2C |
, |
逗號 |
| 45 |
2D |
-- |
連字號或減號 |
| 46 |
2E |
. |
句點或小數點 |
| 47 |
2F |
/ |
斜杠 |
| 48 |
30 |
0 |
零 |
| 49 |
31 |
1 |
1 |
| 50 |
32 |
2 |
2 |
| 51 |
33 |
3 |
3 |
| 52 |
34 |
4 |
4 |
| 53 |
35 |
5 |
5 |
| 54 |
36 |
6 |
6 |
| 55 |
37 |
7 |
7 |
| 56 |
38 |
8 |
8 |
| 57 |
39 |
9 |
9 |
| 58 |
3A |
: |
冒號 |
| 59 |
3B |
; |
分號 |
| 60 |
3C |
< |
小於 |
| 61 |
3D |
= |
等於 |
| 62 |
3E |
> |
大於 |
| 63 |
3F |
? |
問號 |
| ASCII 字母字符 |
|||
| 64 |
40 |
@ |
商業 at 符號 |
| 65 |
41 |
A |
大寫字母 A |
| 66 |
42 |
B |
大寫字母 B |
| 67 |
43 |
C |
大寫字母 C |
| 68 |
44 |
D |
大寫字母 D |
| 69 |
45 |
E |
大寫字母 E |
| 70 |
46 |
F |
大寫字母 F |
| 71 |
47 |
G |
大寫字母 G |
| 72 |
48 |
H |
大寫字母 H |
| 73 |
49 |
I |
大寫字母 I |
| 74 |
4A |
J |
大寫字母 J |
| 75 |
4B |
K |
大寫字母 K |
| 76 |
4C |
L |
大寫字母 L |
| 77 |
4D |
M |
大寫字母 M |
| 78 |
4E |
N |
大寫字母 N |
| 79 |
4F |
O |
大寫字母 O |
| 80 |
50 |
P |
大寫字母 P |
| 81 |
51 |
Q |
大寫字母 Q |
| 82 |
52 |
R |
大寫字母 R |
| 83 |
53 |
S |
大寫字母 S |
| 84 |
54 |
T |
大寫字母 T |
| 85 |
55 |
U |
大寫字母 U |
| 86 |
56 |
V |
大寫字母 V |
| 87 |
57 |
W |
大寫字母 W |
| 88 |
58 |
X |
大寫字母 X |
| 89 |
59 |
Y |
大寫字母 Y |
| 90 |
5A |
Z |
大寫字母 Z |
| 91 |
5B |
[ |
左中括號 |
| 92 |
5C |
\ |
反斜杠 |
| 93 |
5D |
] |
右中括號 |
| 94 |
5E |
^ |
音調符號 |
| 95 |
5F |
_ |
下划線 |
| 96 |
60 |
` |
重音符 |
| 97 |
61 |
a |
小寫字母 a |
| 98 |
62 |
b |
小寫字母 b |
| 99 |
63 |
c |
小寫字母 c |
| 100 |
64 |
d |
小寫字母 d |
| 101 |
65 |
e |
小寫字母 e |
| 102 |
66 |
f |
小寫字母 f |
| 103 |
67 |
g |
小寫字母 g |
| 104 |
68 |
h |
小寫字母 h |
| 105 |
69 |
i |
小寫字母 i |
| 106 |
6A |
j |
小寫字母 j |
| 107 |
6B |
k |
小寫字母 k |
| 108 |
6C |
l |
小寫字母 l |
| 109 |
6D |
m |
小寫字母 m |
| 110 |
6E |
n |
小寫字母 n |
| 111 |
6F |
o |
小寫字母 o |
| 112 |
70 |
p |
小寫字母 p |
| 113 |
71 |
q |
小寫字母 q |
| 114 |
72 |
r |
小寫字母 r |
| 115 |
73 |
s |
小寫字母 s |
| 116 |
74 |
t |
小寫字母 t |
| 117 |
75 |
u |
小寫字母 u |
| 118 |
76 |
v |
小寫字母 v |
| 119 |
77 |
w |
小寫字母 w |
| 120 |
78 |
x |
小寫字母 x |
| 121 |
79 |
y |
小寫字母 y |
| 122 |
7A |
z |
小寫字母 z |
| 123 |
7B |
{ |
左大括號 |
| 124 |
7C |
| |
垂直線 |
| 125 |
7D |
} |
右大括號 (ALTMODE) |
| 126 |
7E |
~ |
代字號 (ALTMODE) |
| 127 |
7F |
DEL |
擦掉 (DELETE) |
| 控制字符 |
|||
| 128 |
80 |
|
[保留] |
| 129 |
81 |
|
[保留] |
| 130 |
82 |
|
[保留] |
| 131 |
83 |
|
[保留] |
| 132 |
84 |
IND |
索引 |
| 133 |
85 |
NEL |
下一行 |
| 134 |
86 |
SSA |
被選區域起始 |
| 135 |
87 |
ESA |
被選區域結束 |
| 136 |
88 |
HTS |
水平制表符集 |
| 137 |
89 |
HTJ |
對齊的水平制表符集 |
| 138 |
8A |
VTS |
垂直制表符集 |
| 139 |
8B |
PLD |
部分行向下 |
| 140 |
8C |
PLU |
部分行向上 |
| 141 |
8D |
RI |
反向索引 |
| 142 |
8E |
SS2 |
單移 2 |
| 143 |
8F |
SS3 |
單移 3 |
| 144 |
90 |
DCS |
設備控制字符串 |
| 145 |
91 |
PU1 |
專用 1 |
| 146 |
92 |
PU2 |
專用 2 |
| 147 |
93 |
STS |
設置傳輸狀態 |
| 148 |
94 |
CCH |
取消字符 |
| 149 |
95 |
MW |
消息等待 |
| 150 |
96 |
SPA |
保護區起始 |
| 151 |
97 |
EPA |
保護區結束 |
| 152 |
98 |
|
[保留] |
| 153 |
99 |
|
[保留] |
| 154 |
9A |
|
[保留] |
| 155 |
9B |
CSI |
控制序列引導符 |
| 156 |
9C |
ST |
字符串終止符 |
| 157 |
9D |
OSC |
操作系統命令 |
| 158 |
9E |
PM |
秘密消息 |
| 159 |
9F |
APC |
應用程序 |
| 其他字符 |
|||
| 160 |
A0 |
|
[保留] 2 |
| 161 |
A1 |
¡ |
反向感嘆號 |
| 162 |
A2 |
¢ |
分幣符 |
| 163 |
A3 |
£ |
英磅符 |
| 164 |
A4 |
|
[保留] 2 |
| 165 |
A5 |
¥ |
人民幣符 |
| 166 |
A6 |
|
[保留] 2 |
| 167 |
A7 |
§ |
章節符 |
| 168 |
A8 |
¤ |
通用貨幣符號 2 |
| 169 |
A9 |
© |
版權符號 |
| 170 |
AA |
ª |
陰性順序指示符 |
| 171 |
AB |
« |
左角引號 |
| 172 |
AC |
|
[保留] 2 |
| 173 |
AD |
|
[保留] 2 |
| 174 |
AE |
|
[保留] 2 |
| 175 |
AF |
|
[保留] 2 |
| 176 |
B0 |
° |
溫度符 |
| 177 |
B1 |
± |
加/減號 |
| 178 |
B2 |
² |
上標 2 |
| 179 |
B3 |
³ |
上標 3 |
| 180 |
B4 |
|
[保留] 2 |
| 181 |
B5 |
µ |
微符 |
| 182 |
B6 |
¶ |
段落符,pilcrow |
| 183 |
B7 |
· |
中點 |
| 184 |
B8 |
|
[保留] 2 |
| 185 |
B9 |
¹ |
上標 1 |
| 186 |
BA |
º |
陽性順序指示符 |
| 187 |
BB |
» |
右角引號 |
| 188 |
BC |
¼ |
分數四分之一 |
| 189 |
BD |
½ |
分數二分之一 |
| 190 |
BE |
|
[保留] 2 |
| 191 |
BF |
¿ |
反向問號 |
| 192 |
C0 |
À |
帶重音符的大寫字母 A |
| 193 |
C1 |
Á |
帶尖銳重音的大寫字母 A |
| 194 |
C2 |
 |
帶音調符號的大寫字母 A |
| 195 |
C3 |
à |
帶代字號的大寫字母 A |
| 196 |
C4 |
Ä |
帶元音變音 (分音符號) 的大寫字母 A |
| 197 |
C5 |
Å |
帶鈴聲的大寫字母 A |
| 198 |
C6 |
Æ |
大寫字母 AE 雙重元音 |
| 199 |
C7 |
Ç |
帶變音符號的大寫字母 C |
| 200 |
C8 |
È |
帶重音符的大寫字母 E |
| 201 |
C9 |
É |
帶尖銳重音的大寫字母 E |
| 202 |
CA |
Ê |
帶音調符號的大寫字母 E |
| 203 |
CB |
Ë |
帶元音變音 (分音符號) 的大寫字母 E |
| 204 |
CC |
Ì |
帶重音符的大寫字母 I |
| 205 |
CD |
Í |
帶尖銳重音的大寫字母 I |
| 206 |
CE |
Î |
帶音調符號的大寫字母 I |
| 207 |
CF |
Ï |
帶元音變音 (分音符號) 的大寫字母 I |
| 208 |
D0 |
|
[保留] 2 |
| 209 |
D1 |
Ñ |
帶代字號的大寫字母 N |
| 210 |
D2 |
Ò |
帶重音符的大寫字母 O |
| 211 |
D3 |
Ó |
帶尖銳重音的大寫字母 O |
| 212 |
D4 |
Ô |
帶音調符號的大寫字母 O |
| 213 |
D5 |
Õ |
帶代字號的大寫字母 O |
| 214 |
D6 |
Ö |
帶元音變音 (分音符號) 的大寫字母 O |
| 215 |
D7 |
OE |
大寫字母 OE 連字 2 |
| 216 |
D8 |
Ø |
帶斜杠的大寫字母 O |
| 217 |
D9 |
Ù |
帶重音符的大寫字母 U |
| 218 |
DA |
Ú |
帶尖銳重音的大寫字母 U |
| 219 |
DB |
Û |
帶音調符號的大寫字母 U |
| 220 |
DC |
Ü |
帶元音變音 (分音符號) 的大寫字母 U |
| 221 |
DD |
Y |
帶元音變音 (分音符號) 的大寫字母 Y |
| 222 |
DE |
|
[保留] 2 |
| 223 |
DF |
ß |
德語高調小寫字母 s |
| 224 |
E0 |
à |
帶重音符的小寫字母 a |
| 225 |
E1 |
á |
帶尖銳重音的小寫字母 a |
| 226 |
E2 |
â |
帶音調符號的小寫字母 a |
| 227 |
E3 |
ã |
帶代字號的小寫字母 a |
| 228 |
E4 |
ä |
帶元音變音 (分音符號) 的小寫字母 a |
| 229 |
E5 |
å |
帶鈴聲的小寫字母 a |
| 230 |
E6 |
æ |
小寫字母 ae 雙重元音 |
| 231 |
E7 |
ç |
帶變音符號的小寫字母 c |
| 232 |
E8 |
è |
帶重音符的小寫字母 e |
| 233 |
E9 |
é |
帶尖銳重音的小寫字母 e |
| 234 |
EA |
ê |
帶音調符號的小寫字母 e |
| 235 |
EB |
ë |
帶元音變音 (分音符號) 的小寫字母 e |
| 236 |
EC |
ì |
帶重音符的小寫字母 i |
| 237 |
ED |
í |
帶尖銳重音的小寫字母 i |
| 238 |
EE |
î |
帶音調符號的小寫字母 i |
| 239 |
EF |
ï |
帶元音變音 (分音符號) 的小寫字母 i |
| 240 |
F0 |
|
[保留] 2 |
| 241 |
F1 |
ñ |
帶代字號的小寫字母 n |
| 242 |
F2 |
ò |
帶重音符的小寫字母 o |
| 243 |
F3 |
ó |
帶尖銳重音的小寫字母 o |
| 244 |
F4 |
ô |
帶音調符號的小寫字母 o |
| 245 |
F5 |
õ |
帶代字號的小寫字母 o |
| 246 |
F6 |
ö |
帶元音變音 (分音符號) 的小寫字母 o |
| 247 |
F7 |
oe |
小寫字母 oe 連字 2 |
| 248 |
F8 |
ø |
帶斜杠的小寫字母 o |
| 249 |
F9 |
ù |
帶重音符的小寫字母 u |
| 250 |
FA |
ú |
帶尖銳重音的小寫字母 u |
| 251 |
FB |
û |
帶音調符號的小寫字母 u |
| 252 |
FC |
ü |
帶元音變音 (分音符號) 的小寫字母 u |
| 253 |
FD |
ÿ |
帶元音變音 (分音符號) 的小寫字母 y 2 |
| 254 |
FE |
|
[保留] 2 |
| 255 |
FF |
|
[保留] 2 |





1、數據類型的定義
