C語言數據類型


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、數據類型的定義

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM