天天看點

C語言資料類型1、資料類型的定義

2. 資料類型

2.1 常量與變量

2.1.1 關鍵字

C語言資料類型1、資料類型的定義

2.1.2 資料類型

資料類型的作用:編譯器預算對象(變量)配置設定的記憶體空間大小。

C語言資料類型1、資料類型的定義

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
C語言資料類型1、資料類型的定義
C語言資料類型1、資料類型的定義
C語言資料類型1、資料類型的定義
C語言資料類型1、資料類型的定義
C語言資料類型1、資料類型的定義

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

繼續閱讀