第 2 章 C 语言的基本数据类型和存储类

21
2 2 C C 第第第第第第第第第第第第第 第第第第第第第第第第第第第 2.1 2.1 第第第第 第第第第 2.1.1 2.1.1 第第第第 第第第第 第第第第第第第第 第第第第第第第第第第第第第第第 第第第第第第第 第第第 ,C,、 第第第第第第第第 第第第第第第第第第第第第第第第 第第第第第第第 第第第 ,C,、 第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第123L 123L 123U 123U 123LU 123LU 第第第第 第第第第第第第第第 第第第第第第 :一,。 第第第第 第第第第第第第第第 第第第第第第 :一,。 第第第第 第第第第第第第 :。 第第第第 第第第第第第第 :。 第第第第第 第第第第第第第 第第第第第 第第第第第第第 x x 第第第第a-f a-f 第第第第第第第第第第第第第第第第第第第第第第第第32767 32767 -32768 -32768 0 0 010 010 011 011 016 016 018 018 ox10 ox10 0xde 0xde 0xf 0xf

description

第 2 章 C 语言的基本数据类型和存储类. 2.1 整型数据 2.1.1 整型常量 整型常量即整常数,C中的整常数可以有三种表示形式,即十进制整数、八进制整数和十六进制整数。 整型常量的说明: 123L 、 123U 、 123LU 十进制数:一串连续的数字表示,最高位非零。 八进制数:以数字零开头。 十六进制数:以数字零和字母 x 开头, a-f 不区分大小写。 考虑如下常数: 32767 , -32768 , 0 , 010 , 011 , 016 , 018 , ox10 , 0xde , 0xf. 2.1.2 整型变量 . - PowerPoint PPT Presentation

Transcript of 第 2 章 C 语言的基本数据类型和存储类

Page 1: 第 2 章  C 语言的基本数据类型和存储类

第第 22 章 章 CC 语言的基本数据类型和存储语言的基本数据类型和存储类类

2.1 2.1 整型数据整型数据 2.1.1 2.1.1 整型常量整型常量整型常量即整常数,C中的整常数可以有三种表示整型常量即整常数,C中的整常数可以有三种表示形式,即十进制整数、八进制整数和十六进制整数。形式,即十进制整数、八进制整数和十六进制整数。整型常量的说明:整型常量的说明: 123L123L 、、 123U123U 、、 123LU123LU

十进制数:一串连续的数字表示,最高位非零。十进制数:一串连续的数字表示,最高位非零。八进制数:以数字零开头。八进制数:以数字零开头。十六进制数:以数字零和字母十六进制数:以数字零和字母 xx 开头,开头, a-fa-f 不区分大小写。不区分大小写。考虑如下常数:考虑如下常数: 3276732767 ,, -32768-32768 ,, 00 ,, 010010 ,, 011011 ,, 016016 ,,018018 ,, ox10ox10 ,, 0xde0xde ,, 0xf0xf

Page 2: 第 2 章  C 语言的基本数据类型和存储类

2.1.2 2.1.2 整型变量整型变量

C语言中的整型变量分为有符号和无符号两种C语言中的整型变量分为有符号和无符号两种 ,, 所有所有变量在使用前必须加以说明或定义。其中变量在使用前必须加以说明或定义。其中 ::

每种有符号整型变量又可细分为标准整型每种有符号整型变量又可细分为标准整型 (int)(int) 、短整型、短整型 (s(short)hort) 和长整型和长整型 (long)(long) 三类三类 ,, 其值可正可负。例如:其值可正可负。例如: int a,b; int a,b; /short c,d;/long f,g;/short c,d;/long f,g;

每种无符号整型变量也可细分为标准整型每种无符号整型变量也可细分为标准整型 (unsigned int)(unsigned int) 、、短整型短整型 (unsigned short)(unsigned short) 和长整型和长整型 (unsigned long)(unsigned long) 三类三类 ,, 其其值不能为负。例如: 值不能为负。例如: unsigned int a,b; / unsigned short c,unsigned int a,b; / unsigned short c,d;/ unsigned long f,g;d;/ unsigned long f,g;

intint 、、 shortshort 和和 longlong 的区别主要在表示的整数范围不同。通的区别主要在表示的整数范围不同。通常以一个机器字来存放一个常以一个机器字来存放一个 intint 型数据。且型数据。且 intint 、、 shortshort 和和longlong 型整数的字长满足:型整数的字长满足: short≤int≤longshort≤int≤long

Page 3: 第 2 章  C 语言的基本数据类型和存储类

2.1.32.1.3 整型数据的存储表示整型数据的存储表示正整数:以原码形式存放在内存中,字长为正整数:以原码形式存放在内存中,字长为 1616 时,整数范时,整数范围取 围取 0-327670-32767 。例如:整数 。例如:整数 5 5 对应 对应 00000000000000101000000000000101 。。负整数:以补码形式存放在内存中。例如负整数:以补码形式存放在内存中。例如 :-5:-5

十进制负整数十进制负整数补码形式补码形式 :: [[11000000000000101]000000000000101] 原码原码

求原码的反码求原码的反码 : [: [11111111111111010]111111111111010] 反码反码

把所得的反码加把所得的反码加 1: [1: [11111111111111011]111111111111011] 补码补码

内存中的补码 内存中的补码 十进制负整数 十进制负整数 ::对补码各位取反对补码各位取反 :[1111111111111010]:[1111111111111010] 补码补码 ,, 取反后得取反后得 :1000000000:1000000000

000101000101

将其转换为十进制数将其转换为十进制数 :: 得得 -5-5

将结果减将结果减 1,1, 得得 -5-1=-6-5-1=-6 。。考虑考虑 [1000000000000000][1000000000000000] 、、 [1111111111111111][1111111111111111]

Page 4: 第 2 章  C 语言的基本数据类型和存储类

2.2 2.2 字符型数据字符型数据2.2.1 2.2.1 字符型常量字符型常量字符型常量是由一对单引号括起来的单个字符字符型常量是由一对单引号括起来的单个字符 (( 可打可打印印 )) 。如:′。如:′ x′,′a′,′A′,′b′,′$′,′#′x′,′a′,′A′,′b′,′$′,′#′ 。。一个转义序列是一个反斜线后跟特定的字符,表示某一个转义序列是一个反斜线后跟特定的字符,表示某些不可打印的字符(如回车符,响铃符等)。例如:些不可打印的字符(如回车符,响铃符等)。例如:\n\n 换行符 换行符 \\\\ 反斜线符 反斜线符 \t\t 水平制表符 水平制表符 \′ \′ 单引号符 单引号符 \b\b 退格符 退格符 \0\0 空字符 空字符 \r\r 回车符 回车符 \ddd\ddd 位型 这里位型 这里 dddddd 是是 11 至至 33位八进制数字位八进制数字

\f\f 换页符 换页符 \0xff\0xff 位型 这里位型 这里 ffff 是是 11 至至 22 位十位十六进制数字六进制数字

Page 5: 第 2 章  C 语言的基本数据类型和存储类

注意:转义序列实际上作为一个字符来对待。但如注意:转义序列实际上作为一个字符来对待。但如果反斜线之后的字符和它不构成转义序列,则′果反斜线之后的字符和它不构成转义序列,则′ \′\′不起转义作用将被忽略。例如:不起转义作用将被忽略。例如:

语句 语句 printf(″A\Nbc\nDEF\n″);printf(″A\Nbc\nDEF\n″);

语句 语句 printf(″\tab\rcd\n\′ef\\gh\x″);printf(″\tab\rcd\n\′ef\\gh\x″);

2.2 2.2 字符型数据字符型数据

Page 6: 第 2 章  C 语言的基本数据类型和存储类

字符型变量是通过保留字字符型变量是通过保留字 charchar 来说明的,其格式如来说明的,其格式如下下 ::

char c1, c2;char c1, c2;

该语句说明了该语句说明了 c1c1 和和 c2c2 两个字符型变量。每个字符型两个字符型变量。每个字符型变量可用来存放一个字符,例如:变量可用来存放一个字符,例如: #include “stdio.h”#include “stdio.h”

main()main()

{ char ch;{ char ch;

ch=getchar();ch=getchar();

putchar(ch); putchar(ch);

}}

2.2.2 2.2.2 字符型变量字符型变量

Page 7: 第 2 章  C 语言的基本数据类型和存储类

2.2.32.2.3 字符型数据的存储表示字符型数据的存储表示字符数据在计算机内部也是以一个字节的二进制形字符数据在计算机内部也是以一个字节的二进制形式来表示的,即事先对所要处理的每个字符都进行式来表示的,即事先对所要处理的每个字符都进行编码(通常是一个整型数)且不同的字符其编码也编码(通常是一个整型数)且不同的字符其编码也不相同。不相同。例如: 例如:

#include “stdio.h” #include “stdio.h ”#include “stdio.h” #include “stdio.h ” main() main() main() main() {char bell; {{char bell; { bell=7; putchar(7); bell=7; putchar(7); putchar(be); }putchar(be); } }}

Page 8: 第 2 章  C 语言的基本数据类型和存储类

main()main()

{ char c1, c2;{ char c1, c2;

c1=‘a’;c1=‘a’;

c2=‘b’;c2=‘b’;

c1=c1-32;c1=c1-32;

c2=c2-32;c2=c2-32;

printf(“c1=%c c2=%cprintf(“c1=%c c2=%c \\ n”,c1,c2);n”,c1,c2);

printf(“ c1_ASCII_CODE=%d c2_ASCII_CODE=%d\n ”,c1,c2);printf(“ c1_ASCII_CODE=%d c2_ASCII_CODE=%d\n ”,c1,c2);

}}

运行结果:运行结果:printfprintf 中的参数个数可以有多个,但第一个参数必须是字符串,中的参数个数可以有多个,但第一个参数必须是字符串,我们称其为格式串(我们称其为格式串( format-stringformat-string )。)。

c1=A c2=Bc1=A c2=B

c1_ASCII_CODE=65 c2_ASCII_CODE=65c1_ASCII_CODE=65 c2_ASCII_CODE=65

2.2.32.2.3 字符型数据的存储表示字符型数据的存储表示

Page 9: 第 2 章  C 语言的基本数据类型和存储类

printfprintf 首先对格式串从左向右扫描,当遇到可显示字符时就在首先对格式串从左向右扫描,当遇到可显示字符时就在终端上原样输出,当遇到控制字符(如‘终端上原样输出,当遇到控制字符(如‘ \n’\n’ ,响铃符等)就,响铃符等)就产生相应的动作(换行,响铃等),当遇到转换符时,就将后产生相应的动作(换行,响铃等),当遇到转换符时,就将后面的实参依次按转换符的要求转换并输出。常用的转换符有:面的实参依次按转换符的要求转换并输出。常用的转换符有:%d %d 十进制整型、十进制整型、 %c %c 字符型、字符型、 %f %f 浮点型、浮点型、 %s %s 字符串型字符串型在使用在使用 ASCIIASCII 编码系统的机器上,用C编写一个将大写英文编码系统的机器上,用C编写一个将大写英文字母转换为小写字母的程序,可用如下一些语句实现:字母转换为小写字母的程序,可用如下一些语句实现:

{ char ch;{ char ch;

ch=getchar();ch=getchar();

if(ch>=‘A’ && ch<=‘Z’) putchar(‘a’+ch-’A’);if(ch>=‘A’ && ch<=‘Z’) putchar(‘a’+ch-’A’);

}}

若将上面程序中的字符常量‘若将上面程序中的字符常量‘ A’A’ , ‘ , ‘ Z’Z’ 和‘和‘ a’a’ 分别用整分别用整常数常数 6565 ,, 9090 和和 9797 来代替程序能否正确运行?来代替程序能否正确运行?

2.2.32.2.3 字符型数据的存储表示字符型数据的存储表示

Page 10: 第 2 章  C 语言的基本数据类型和存储类

C编译系统将字符型数据当成有符号整型还是无符号整型没有C编译系统将字符型数据当成有符号整型还是无符号整型没有规定。例如:规定。例如: main()main()

{ char ch;{ char ch;

ch=‘\376’;ch=‘\376’;

printf(“%d”,ch);printf(“%d”,ch);

}}

如果将字符看成无符号的,则输出如果将字符看成无符号的,则输出 254254 ,否则,输出,否则,输出 -2-2 。。字符量可参与任何整数运算字符量可参与任何整数运算 , , 如: 如: ‘ ‘ B’-’A’=66-65=1;‘a’+1=97+B’-’A’=66-65=1;‘a’+1=97+1=‘b’ 1=‘b’

数字字符 数字字符 整数值 整数值 , , 如如 : ‘9’-‘0’=57-48=9;9+‘0’=9=48=57=‘9’;: ‘9’-‘0’=57-48=9;9+‘0’=9=48=57=‘9’;

字符量可以参加关系运算字符量可以参加关系运算 , , 如如 : ‘a’<‘b’=: ‘a’<‘b’=真真字符量可以参加逻辑运算字符量可以参加逻辑运算 , , 如如 : ‘a’&&‘b’=: ‘a’&&‘b’=真真

2.2.32.2.3 字符型数据的存储表示字符型数据的存储表示

Page 11: 第 2 章  C 语言的基本数据类型和存储类

2.2.42.2.4 字符串常量字符串常量字符串常量是用一对双引号括起来的零个或多个字符的序列。字符串常量是用一对双引号括起来的零个或多个字符的序列。如:“如:“ I am a student”I am a student” , “ , “ x”x” , “”其中, “”其中 ::

“”“”只充当字符串的分界符,而不是字符串的一部分。只充当字符串的分界符,而不是字符串的一部分。如果字符串中要出现双引号,则必须经过转义序列,如: 如果字符串中要出现双引号,则必须经过转义序列,如: TThe “a” is an indef art he “a” is an indef art 写成字符串应该是:写成字符串应该是:

“ “The \042a\042 is an indef art ”The \042a\042 is an indef art ”

字符串中所含的字符个数称字符串的长度。例:“字符串中所含的字符个数称字符串的长度。例:“ XYZ”XYZ” 的的长度为长度为 33 ,“”的长度为,“”的长度为 00 ,称为空串。,称为空串。字符串所占的空间为长度字符串所占的空间为长度 +1+1 ,增加的一个字节存放字符串,增加的一个字节存放字符串‘‘ \0’\0’ 作为字符串的结尾标志。作为字符串的结尾标志。转义序列也可以出现在字符串中。但是只作为一个字符看待。转义序列也可以出现在字符串中。但是只作为一个字符看待。例如: “例如: “ I am a\n student”I am a\n student” 。。

Page 12: 第 2 章  C 语言的基本数据类型和存储类

2.32.3 浮点型数据浮点型数据2.3.1 2.3.1 浮点型常量浮点型常量 浮点型常量有非指数型和指数型两种。浮点型常量有非指数型和指数型两种。

非指数型非指数型 :: 是指不带指数部分的实型常数,如 是指不带指数部分的实型常数,如 +123.+123. ,, 12123.3. ,, -123-123 ,, +123.45+123.45 ,, 123.45123.45 ,, -123.45-123.45

指数型指数型 :: 是指带有指数部分的实数,如是指带有指数部分的实数,如 .12345e2.12345e2 ,, 12345.0e-312345.0e-3 ,,它们的值都是它们的值都是 12.34512.345 。。

ee (( EE )之前必须有数字,之后的指数必须为整数,且不能插)之前必须有数字,之后的指数必须为整数,且不能插入空格!入空格!

2.3.2 2.3.2 浮点型变量浮点型变量 浮点型变量是通过保留字浮点型变量是通过保留字 floatfloat 来说明的。如:来说明的。如:

float x, y, z;float x, y, z; x=12.345;x=12.345; y=.12345e2;y=.12345e2; z=12345.e-3;z=12345.e-3;

Page 13: 第 2 章  C 语言的基本数据类型和存储类

2.3.32.3.3 浮点型数据的存储表示浮点型数据的存储表示 浮点型数据的存储表示浮点型数据的存储表示 :: 二进制的浮点形式。如 二进制的浮点形式。如 (0.5)(0.5)1010=(0.1)=(0.1)22

=(.1×2=(.1×20 0 )=(1×2)=(1×2-1 -1 ))

(12.1875)(12.1875)1010=(1100.0011)=(1100.0011)22=(.11000011×2=(.11000011×244)=(11000011×2)=(11000011×2-4-4))

而任何一个二进制实数总可以表示成:而任何一个二进制实数总可以表示成: N=S×2N=S×2p p 其中:其中: pp 、、 SS 都是有符号二进制整数。都是有符号二进制整数。 pp 称为阶码,称为阶码, SS 称为尾数 称为尾数 注意:注意: SS 中无小数点或小数点约定为在最前头。中无小数点或小数点约定为在最前头。 设设 pp 的字长为的字长为 n1n1 ,, SS 的字长为的字长为 n2n2 ,则有 ,则有 -2-2n1-1n1-1≤p≤2≤p≤2n1-1n1-1-1,-1,

-2-2n2-1n2-1≤S≤2≤S≤2n2-1n2-1-1-1 , 则一个实数的字长为:, 则一个实数的字长为: n1+n2n1+n2 。例如:。例如:设 设 n2=24 n1=8 n2=24 n1=8 ,,则有:则有: -128≤p≤127,-8388608≤S≤8388607-128≤p≤127,-8388608≤S≤8388607

即 即 N=S×2N=S×2p p 的取值范围是:的取值范围是: 22-128-128≤≤|| NN|≤|≤ 22127127 ,, 约为 约为 1010-39-39≤≤|| NN|≤|≤ 101038 38 而而 NN 的精度大约为的精度大约为 77 位有效位有效数字数字

Page 14: 第 2 章  C 语言的基本数据类型和存储类

2.4 2.4 双精度型数据双精度型数据双精度型:字长比浮点型多一倍,一般占用双精度型:字长比浮点型多一倍,一般占用 88 个字个字

节。其中:(节。其中:( n2=48n2=48 )) ++ (( n1=16n1=16 )) =64 =64 其精度大约为其精度大约为 1717 位有效数字,浮点型为位有效数字,浮点型为 77 位精度;位精度; C中每个浮点常量在机中都是以双精度型来存放和C中每个浮点常量在机中都是以双精度型来存放和

表示的;表示的;双精度变量是通过双精度变量是通过 doubledouble 保留字来说明的,如:保留字来说明的,如: double a,b;double a,b;

a=2.718281828459;a=2.718281828459;

b=4.84813681106e-7;b=4.84813681106e-7;

Page 15: 第 2 章  C 语言的基本数据类型和存储类

main() main() { float x; double y; int i;{ float x; double y; int i; x=0.0; y=0.0; i=1;x=0.0; y=0.0; i=1; while(i<=10000)while(i<=10000) {{ x=x+100000.0; y=y+100000.0;i=i+1;x=x+100000.0; y=y+100000.0;i=i+1; }} x=x/10000.0; y=y/10000.0;x=x/10000.0; y=y/10000.0; printf(“x=%f, y=%f\n”, x, y,);printf(“x=%f, y=%f\n”, x, y,);}}

运行结果为:运行结果为:

可以看出可以看出 xx 有约有约 1.5‰1.5‰ 的误差,而的误差,而 yy 没有精度损失。没有精度损失。

2.4 2.4 双精度型数据双精度型数据

x=99985.179688, y=100000.000000x=99985.179688, y=100000.000000

Page 16: 第 2 章  C 语言的基本数据类型和存储类

2.52.5 变量的初始化变量的初始化 程序中,在变量说明完之后到使用之前,要对其赋初值。如程序中,在变量说明完之后到使用之前,要对其赋初值。如 :: int i,j; int i=0,j=0;int i,j; int i=0,j=0; i=0; ┇i=0; ┇ j=0; while(i<=15)j=0; while(i<=15) ┇ ┇ ┇ ┇ while(i<=15)while(i<=15) ┇ ┇ 两者是等效的。其它类型变量的初始化方法类似,如:两者是等效的。其它类型变量的初始化方法类似,如:

int i=1,j,k=3;int i=1,j,k=3;char bell=7,esc=27,sex=‘f’;char bell=7,esc=27,sex=‘f’;float pi=3.14159; float pi=3.14159; double loge=2.718281828459;double loge=2.718281828459;

Page 17: 第 2 章  C 语言的基本数据类型和存储类

2.62.6 变量的存储类变量的存储类 变量的两个属性变量的两个属性 : : 存在性和可见性存在性和可见性

存在性存在性 : : 是指变量都具有一个数据类型并以一定的方式存于是指变量都具有一个数据类型并以一定的方式存于内存之中。内存之中。

可见性可见性 :: 是指在其作用域中是可见的(活动的),而一旦出了是指在其作用域中是可见的(活动的),而一旦出了其作用域便不再可见。其作用域便不再可见。

变量的作用域变量的作用域 : : 是指该变量有定义的程序部分。是指该变量有定义的程序部分。 变量的以上两个属性是由以下四个变量存储类决定的:变量的以上两个属性是由以下四个变量存储类决定的:

自动的(自动的( autoauto ) 寄存器() 寄存器( registerregister )) 静态的(静态的( staticstatic ) 外部的() 外部的( externextern ))

Page 18: 第 2 章  C 语言的基本数据类型和存储类

2.6.12.6.1 自动变量自动变量 由保留字由保留字 autoauto 说明或定义的变量。例如:说明或定义的变量。例如:

{ auto int a;{ auto int a;

auto char ch=‘x’;auto char ch=‘x’;

auto float d,e;auto float d,e;

auto double f1,f2;auto double f1,f2;

}}

AutoAuto 可省略不写可省略不写自动变量是局部变量,其作用域局限于其所在的函自动变量是局部变量,其作用域局限于其所在的函

数或块。数或块。自动变量每进入一次函数体,就赋一次指定的初值。自动变量每进入一次函数体,就赋一次指定的初值。

Page 19: 第 2 章  C 语言的基本数据类型和存储类

2.6.22.6.2 寄存器变量寄存器变量 寄存器变量是通过在变量说明前面加保留字寄存器变量是通过在变量说明前面加保留字 registerregister 来完成来完成

的。的。 寄存器变量的用法和作用域规定与自动变量相同。如:寄存器变量的用法和作用域规定与自动变量相同。如:

register int x=3;register int x=3;

register char c1,c2;register char c1,c2;

register float f1,f2;register float f1,f2;

register double d1,d2;register double d1,d2; 变量保留在变量保留在 CPUCPU 的寄存器中,只是对编译程序的一种建议,的寄存器中,只是对编译程序的一种建议,而不是强制性的。而不是强制性的。

寄存器变量无地址,无法对其进行求地址运算。寄存器变量无地址,无法对其进行求地址运算。 寄存器变量说明应尽量靠近其使用的地方,用完后尽快释放。寄存器变量说明应尽量靠近其使用的地方,用完后尽快释放。

Page 20: 第 2 章  C 语言的基本数据类型和存储类

2.6.32.6.3 静态变量静态变量静态变量是通过在变量说明前面加保留字静态变量是通过在变量说明前面加保留字 staticstatic 来说来说

明的,如:明的,如: static int x=1;static int x=1;

static char c1;static char c1;

static float f1;static float f1;

static double d1,d2;static double d1,d2;

静态局部变量的生存期一直延长到程序运行结束。静态局部变量的生存期一直延长到程序运行结束。静态局部变量不一定赋初值,编译时对无值的赋予静态局部变量不一定赋初值,编译时对无值的赋予 00 。。静态局部变量的作用域与静态局部变量的作用域与 autoauto 、、 registerregister 相同。相同。

Page 21: 第 2 章  C 语言的基本数据类型和存储类

2.6.42.6.4 外部变量外部变量 外部变量是在函数外部任意位置上定义的全局变量。外部变量是在函数外部任意位置上定义的全局变量。 外部变量的作用域:从变量定义的位置开始,到整个源文件外部变量的作用域:从变量定义的位置开始,到整个源文件

结束为止。结束为止。 外部变量的生存期:整个程序的运行期间。外部变量的生存期:整个程序的运行期间。 外部变量与局部变量同名时,外部变量被屏蔽。外部变量与局部变量同名时,外部变量被屏蔽。 在每个引用外部变量的函数中都对相应的外部变量加以说明。在每个引用外部变量的函数中都对相应的外部变量加以说明。

例如:例如: int x=123;int x=123; main()main() { extern int x,y;{ extern int x,y; printf(“%d\n%d\n”,x,y);printf(“%d\n%d\n”,x,y); }} int y=321;int y=321;