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進位。
十進制 | 二進制 | 八進制 | 十六進制 |
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值 | 字元 |
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 | 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 | |||
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 | 零 | |
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、資料類型的定義
1、資料類型的定義 變量的定義: 資料類型 變量名【辨別符】 變量的指派: 變量名 = 值; 資料類型 變量名【辨別符】 = 值 标示符的命名規則: 1、字母、數字、下劃線 2、不能以數字開頭 3、見名知義 4、不能和同一函數内的其他标示符重複 5、不能使用C語言關鍵字 6、區分大小寫 标示符: ABC abc —abc _abc. 123_bac a_b_123 常量的定義: 1、const 資料類型 常量名 2、【宏定義】#deifne 常量名 值 注意: 1、通過#define 定義的常量 是根據值來比對資料類型的 2、const 修飾的常量是不安全 可以通過指針來修改 2、進制: 二進制: 二進制逢二進一,所有的數組是0、1組成 十進制轉二進制: 除二反序取餘法:将十進制數每次除以2 取出餘數 按照結果倒叙依次擷取結果 二進制轉十進制: 權值法:将二進制數各個位數從0位開始乘以2的N幂 将各個位數的結果相加 八進制: 八進制逢八進一,所有的數組是0到7組成 十進制轉八進制: 除八反序取餘法:将十進制數每次除以8 取出餘數 按照結果倒叙依次擷取結果 十六進制: 十六進制逢十六進一,所有的數組是0到9和A到F組成 字母不區分大小寫 十進制轉八進制: 除十六反序取餘法:将十進制數每次除以16 取出餘數 按照結果倒叙依次擷取結果 8421法則: 将各個位數的二進制用十進制中的【數字 】來表示多位的二進制數 通過【數字 】相加就可以得到二進制數的資料 8 1000 4 100 2 10 1 1 1000 100 10 1 ———— 1 1 1 1 進制在程式中列印: int a=10;//十進制中的10 int b=010;//八進制中的10 在程式中定義一個八進制數需要在數前面加上0區分 int c=0x10;//十六進制中的10在程式中定義一個十六進制數需要在數前面加上0x區分 int d=0X10;//十六進制中的10在程式中定義一個十六進制數需要在數前面加上0X區分 注意:在程式中沒有辦法表示一個二進制數 %d 将資料按照十進制輸出 %o将資料按照八進制輸出 %x将資料按照十六進制小寫輸出 %X将資料按照十六進制大寫輸出 3、原碼、反碼、補碼 一個有符号的整型資料可以分為兩部分一部分是符号位、一部分是數字位 無符号資料類型隻包含數字位部分 signed int a= 1986(有符号辨別 signed可以不用寫) 二進制:11111000010 1986原碼:0000 0000 0000 0000 0000 0111 1100 0010 -1986原碼:1000 0000 0000 0000 0000 0111 1100 0010 1986反碼: 0000 0000 0000 0000 0000 0111 1100 0010 -1986反碼:1111 1111 1111 1111 1111 1000 0011 1101 1986補碼: 0000 0000 0000 0000 0000 0111 1100 0010 -1986反碼:1111 1111 1111 1111 1111 1000 0011 1110 1 0000 0000 0000 0000 0000 0000 0000 0000 溢出:在資料進行操作的時候會導緻超出資料類型大小,會向前位進1,多于原始資料類型大小,會被系統自動舍棄 保留從後面開始資料類型大小的位數 10+20 0000 1010 0001 0100 0001 1110 -10+-20 原碼:1000 1010 反碼:1111 0101 補碼:1111 0110 原碼:1001 0100 反碼:1110 1011 補碼:1110 1100 1111 0110 1110 1100 補碼:1110 0010 反碼:1110 0001 原碼:1001 1110 16+8+4+2=-30 練習:用生辰年份年去生辰日期 1992 -326 1、将10進制轉化為二進制 1992 :0000 0000 0000 0000 0000 0111 1100 1000 -326 :0000 0000 0000 0000 0000 0001 0100 0110 2、加符号位将資料變為原碼 1992 :0000 0000 0000 0000 0000 0111 1100 1000 -326 :1000 0000 0000 0000 0000 0001 0100 0110 3、轉化為反碼 1992 :0000 0000 0000 0000 0000 0111 1100 1000 -326 :1111 1111 1111 1111 1111 1110 1011 1001 4、将反碼+1轉化為補碼 1992 :0000 0000 0000 0000 0000 0111 1100 1000 -326 :1111 1111 1111 1111 1111 1110 1011 1010 5、計算補碼 1992 :0000 0000 0000 0000 0000 0111 1100 1000 -326 :1111 1111 1111 1111 1111 1110 1011 1010 結果 : 1 0000 0000 0000 0000 0000 0110 1000 0010 6、将資料轉化為10進制 110 1000 0010 2+128+512+1024 = 1666 無符号: unsigned int a= 1986 無符号:1111 1111 1111 1111 1111 1111 1111 1111 = 0000 0000 0000 0000 0000 0000 0000 0000 =0 無符号整型取值:0-4294967295(2^32-1) 無符号的字元型:0-255 有符号: int a= 1986 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647 0000 0000 0000 0000 0000 0000 0000 0001 原碼: 1111 1111 1111 1111 1111 1111 1111 1111 = -2147483647 反碼:1000 0000 0000 0000 0000 0000 0000 0000 補碼:1000 0000 0000 0000 0000 0000 0000 0001=-2147483647 -0的補碼 補碼:1000 0000 0000 0000 0000 0000 0000 0000=-0 = -2147483648
轉載于:https://www.cnblogs.com/WangGuiHandsome/p/9870298.html