1 / 21

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

第 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 整型变量 .

cargan
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第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. 2.1.2 整型变量 • C语言中的整型变量分为有符号和无符号两种,所有变量在使用前必须加以说明或定义。其中: • 每种有符号整型变量又可细分为标准整型(int)、短整型(short)和长整型(long)三类,其值可正可负。例如:int a,b; /short c,d;/long f,g; • 每种无符号整型变量也可细分为标准整型(unsigned int)、短整型(unsigned short)和长整型(unsigned long)三类,其值不能为负。例如: unsigned int a,b; / unsigned short c,d;/ unsigned long f,g; • int、short和long的区别主要在表示的整数范围不同。通常以一个机器字来存放一个int型数据。且int、short和long型整数的字长满足:short≤int≤long

  3. 2.1.3整型数据的存储表示 • 正整数:以原码形式存放在内存中,字长为16时,整数范围取 0-32767。例如:整数 5 对应 0000000000000101。 • 负整数:以补码形式存放在内存中。例如:-5 • 十进制负整数补码形式: • [1000000000000101]原码 • 求原码的反码: [1111111111111010]反码 • 把所得的反码加1: [1111111111111011]补码 • 内存中的补码  十进制负整数: • 对补码各位取反:[1111111111111010]补码,取反后得:1000000000000101 • 将其转换为十进制数:得-5 • 将结果减1,得-5-1=-6。 • 考虑[1000000000000000]、[1111111111111111]

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

  5. 2.2 字符型数据 • 注意:转义序列实际上作为一个字符来对待。但如果反斜线之后的字符和它不构成转义序列,则′\′不起转义作用将被忽略。例如: • 语句 printf(″A\Nbc\nDEF\n″); • 语句 printf(″\tab\rcd\n\′ef\\gh\x″);

  6. 2.2.2 字符型变量 • 字符型变量是通过保留字char来说明的,其格式如下: char c1, c2; • 该语句说明了c1和c2两个字符型变量。每个字符型变量可用来存放一个字符,例如: #include “stdio.h” main() { char ch; ch=getchar(); putchar(ch); }

  7. #include “stdio.h” #include “stdio.h ” main() main() {char bell; { bell=7; putchar(7); putchar(be); } } 2.2.3字符型数据的存储表示 • 字符数据在计算机内部也是以一个字节的二进制形式来表示的,即事先对所要处理的每个字符都进行编码(通常是一个整型数)且不同的字符其编码也不相同。 • 例如:

  8. 2.2.3字符型数据的存储表示 main() { char c1, c2; c1=‘a’; c2=‘b’; c1=c1-32; c2=c2-32; printf(“c1=%c c2=%c\n”,c1,c2); printf(“ c1_ASCII_CODE=%d c2_ASCII_CODE=%d\n ”,c1,c2); } • 运行结果: • printf中的参数个数可以有多个,但第一个参数必须是字符串,我们称其为格式串(format-string)。 c1=A c2=B c1_ASCII_CODE=65 c2_ASCII_CODE=65

  9. 2.2.3字符型数据的存储表示 • printf首先对格式串从左向右扫描,当遇到可显示字符时就在终端上原样输出,当遇到控制字符(如‘\n’,响铃符等)就产生相应的动作(换行,响铃等),当遇到转换符时,就将后面的实参依次按转换符的要求转换并输出。常用的转换符有:%d 十进制整型、%c 字符型、%f 浮点型、%s 字符串型 • 在使用ASCII编码系统的机器上,用C编写一个将大写英文字母转换为小写字母的程序,可用如下一些语句实现: { char ch; ch=getchar(); if(ch>=‘A’ && ch<=‘Z’) putchar(‘a’+ch-’A’); } • 若将上面程序中的字符常量‘A’, ‘ Z’和‘a’分别用整常数65,90和97来代替程序能否正确运行?

  10. 2.2.3字符型数据的存储表示  • C编译系统将字符型数据当成有符号整型还是无符号整型没有规定。例如: main() { char ch; ch=‘\376’; printf(“%d”,ch); } • 如果将字符看成无符号的,则输出254,否则,输出-2。 • 字符量可参与任何整数运算, 如: ‘B’-’A’=66-65=1;‘a’+1=97+1=‘b’ • 数字字符  整数值, 如: ‘9’-‘0’=57-48=9;9+‘0’=9=48=57=‘9’; • 字符量可以参加关系运算, 如: ‘a’<‘b’=真 • 字符量可以参加逻辑运算, 如: ‘a’&&‘b’=真

  11. 2.2.4字符串常量 • 字符串常量是用一对双引号括起来的零个或多个字符的序列。如:“I am a student”, “ x”, “”其中: • “”只充当字符串的分界符,而不是字符串的一部分。 • 如果字符串中要出现双引号,则必须经过转义序列,如: The “a” is an indef art 写成字符串应该是: “The \042a\042 is an indef art ” • 字符串中所含的字符个数称字符串的长度。例:“XYZ”的长度为3,“”的长度为0,称为空串。 • 字符串所占的空间为长度+1,增加的一个字节存放字符串‘\0’作为字符串的结尾标志。 • 转义序列也可以出现在字符串中。但是只作为一个字符看待。例如: “I am a\n student”。

  12. 2.3浮点型数据 2.3.1 浮点型常量 • 浮点型常量有非指数型和指数型两种。 • 非指数型:是指不带指数部分的实型常数,如 +123.,123.,-123,+123.45,123.45,-123.45 • 指数型:是指带有指数部分的实数,如.12345e2,12345.0e-3,它们的值都是12.345。 • e(E)之前必须有数字,之后的指数必须为整数,且不能插入空格! 2.3.2 浮点型变量 • 浮点型变量是通过保留字float来说明的。如: float x, y, z; x=12.345; y=.12345e2; z=12345.e-3;

  13. 2.3.3浮点型数据的存储表示 • 浮点型数据的存储表示:二进制的浮点形式。如 (0.5)10=(0.1)2=(.1×20 )=(1×2-1 ) (12.1875)10=(1100.0011)2=(.11000011×24)=(11000011×2-4) • 而任何一个二进制实数总可以表示成:N=S×2p 其中: p、S都是有符号二进制整数。p称为阶码,S称为尾数 • 注意:S中无小数点或小数点约定为在最前头。 • 设p的字长为n1,S的字长为n2,则有 -2n1-1≤p≤2n1-1-1, -2n2-1≤S≤2n2-1-1, 则一个实数的字长为:n1+n2。例如: • 设 n2=24 n1=8 , • 则有:-128≤p≤127,-8388608≤S≤8388607 即 N=S×2p 的取值范围是:2-128≤|N|≤2127, 约为 10-39≤|N|≤1038 而N的精度大约为7位有效数字

  14. 2.4 双精度型数据 • 双精度型:字长比浮点型多一倍,一般占用8个字节。其中:(n2=48)+(n1=16)=64 • 其精度大约为17位有效数字,浮点型为7位精度; • C中每个浮点常量在机中都是以双精度型来存放和表示的; • 双精度变量是通过double保留字来说明的,如: double a,b; a=2.718281828459; b=4.84813681106e-7;

  15. 2.4 双精度型数据  main() { float x; double y; int i; x=0.0; y=0.0; i=1; while(i<=10000) { x=x+100000.0; y=y+100000.0;i=i+1; } x=x/10000.0; y=y/10000.0; printf(“x=%f, y=%f\n”, x, y,); } • 运行结果为: • 可以看出x有约1.5‰的误差,而y没有精度损失。 x=99985.179688, y=100000.000000

  16. 2.5变量的初始化 • 程序中,在变量说明完之后到使用之前,要对其赋初值。如: int i,j; int i=0,j=0; i=0; ┇ j=0; while(i<=15) ┇ ┇ while(i<=15) ┇ • 两者是等效的。其它类型变量的初始化方法类似,如: int i=1,j,k=3; char bell=7,esc=27,sex=‘f’; float pi=3.14159; double loge=2.718281828459;

  17. 2.6变量的存储类 • 变量的两个属性: 存在性和可见性 • 存在性: 是指变量都具有一个数据类型并以一定的方式存于内存之中。 • 可见性:是指在其作用域中是可见的(活动的),而一旦出了其作用域便不再可见。 • 变量的作用域: 是指该变量有定义的程序部分。 • 变量的以上两个属性是由以下四个变量存储类决定的: 自动的(auto) 寄存器(register) 静态的(static) 外部的(extern)

  18. 2.6.1自动变量 • 由保留字auto说明或定义的变量。例如: { auto int a; auto char ch=‘x’; auto float d,e; auto double f1,f2; } • Auto可省略不写 • 自动变量是局部变量,其作用域局限于其所在的函数或块。 • 自动变量每进入一次函数体,就赋一次指定的初值。

  19. 2.6.2寄存器变量 • 寄存器变量是通过在变量说明前面加保留字register来完成的。 • 寄存器变量的用法和作用域规定与自动变量相同。如: register int x=3; register char c1,c2; register float f1,f2; register double d1,d2; • 变量保留在CPU的寄存器中,只是对编译程序的一种建议,而不是强制性的。 • 寄存器变量无地址,无法对其进行求地址运算。 • 寄存器变量说明应尽量靠近其使用的地方,用完后尽快释放。

  20. 2.6.3静态变量 • 静态变量是通过在变量说明前面加保留字static来说明的,如: static int x=1; static char c1; static float f1; static double d1,d2; • 静态局部变量的生存期一直延长到程序运行结束。 • 静态局部变量不一定赋初值,编译时对无值的赋予0。 • 静态局部变量的作用域与auto、register相同。

  21. 2.6.4外部变量 • 外部变量是在函数外部任意位置上定义的全局变量。 • 外部变量的作用域:从变量定义的位置开始,到整个源文件结束为止。 • 外部变量的生存期:整个程序的运行期间。 • 外部变量与局部变量同名时,外部变量被屏蔽。 • 在每个引用外部变量的函数中都对相应的外部变量加以说明。例如: int x=123; main() { extern int x,y; printf(“%d\n%d\n”,x,y); } int y=321;

More Related