610 likes | 785 Views
第二章. 数据的存储与运算. 本章要点. 数据的描述规则 数据的操作规则. 主要内容. 2.1 数据在计算机中是怎样存储的 2.2 整型数据 2.3 实型数据 2.4 字符型数据 2.5 符号常量 2.6 算术运算符和算术表达式 2.7 C 运算符和 C 表达式 2.8 注意. 2.1 数据在计算机中是怎样存储的. 2.1.1 数据在计算机中是以二进制形式存储的. 计算机内部的信息都是用二进制来表示的。 二进制数的特点是 “ 逢二进一 ” 。每一位的值只有 0 和 1 两种可能。
E N D
第二章 数据的存储与运算
本章要点 数据的描述规则 数据的操作规则
主要内容 2.1 数据在计算机中是怎样存储的 2.2 整型数据 2.3 实型数据 2.4 字符型数据 2.5 符号常量 2.6 算术运算符和算术表达式 2.7 C运算符和C表达式 2.8 注意
2.1 数据在计算机中是怎样存储的 2.1.1 数据在计算机中是以二进制形式存储的 • 计算机内部的信息都是用二进制来表示的。 • 二进制数的特点是“逢二进一”。每一位的值只有0和1两种可能。 • 例如:十进制数10,用二进制表示是1010。它的含义是: 每一个二进位代表不同的幂,最右边一位代表2的0次方,最右边第二位代表2的1次方,以此类推。显然一个很大的整数可能需要几十个“二进制位”来代表
1 2 3 4 5 104 103 102 101 100 12345=1*104+2*103+3*102+4*101+5*100 1 0 0 1 0 1 25 24 23 22 21 20 100101=1*25+0*24+0*23+1*22+0*21+1*20
2.1 数据在计算机中是怎样存储的 2.1.2 位、字节和地址 位:又称“比特”(bit)。每一个二极管元件称为一个“二进制位”,是存储信息的最小单位。它的值是“1”或“0”。 字节:又称“拜特”(byte)。一般将8个“二进制位”组织成一组,称为“字节”。 地址:计算机的存储器包含许多存储单元,操作系统把所有存储单元以字节为单位编号 。
b, B • 一个位有多大? • 只能是“0”或者“1”,这叫二进制 • 一个字节有多大? • 保存一个字符(英文字母、数字、符号) • ASCII(美国标准信息交换码)编码 • 两个字节保存一个汉字 • GB编码 • 可以表示数字0~255
b, B, KB, MB, GB, TB • bit,中文叫法:位 • Byte,中文叫法:字节 • Kilobyte(KB),中文叫法: K • Megabyte(MB),中文叫法:兆 • Gigabyte(GB),中文叫法:G • Terabyte(TB),中文叫法:T 1 TB ==1,024 GB 1 GB==1,024 MB 1 MB==1,024 KB 1 KB==1,024 B 1 B ==8 b
2.1 数据在计算机中是怎样存储的 2.1.3 数据类型 • 程序中使用的数据必须说明其类型 • 不同类型的数据 • 在内存占用不同长度的存储空间 • 采用不同的存储方式 • 对应不同的取值范围 • 有不同的操作集合
基本整型 长整型 整型 短整型 无符号整型 基本类型 单精度实型 实型(浮点型) 双精度实型 字符型 枚举类型 数据类型 数组类型 构造类型 结构体类型 共用体类型 指针类型 空类型 C语言的数据类型(Data Type)
2.2 整型数据 • 整数的存储方式 • 十进制整数先转换为二进制形式。 • 例如:整数10以二进制形式表示是1010,直接把它存放在存储单元中。
余1 余0 余1 余0 余1 余0 *十 进 制 数 转 换 成 二 进 制 数 37 2 2 18 2 9 2 4 2 2 1 2 按产生余数的相反顺序 0 (37)10=(1 0 0 1 0 1)2
原码为: 原码为: 每位取反为: 末位加1为: *整数的存储结构----补码 正整数的补码为原码 01100100 100 负整数的补码为对应正整数的原码每位取反,末位加1 最高位为1, 作为符号位! 100 01100100 10011011 -100的补码 10011100
8位二进制数所表示的整数范围为 -27~27-1(-128~127) 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 4位二进制数所表示的整数范围为 -23~23-1(-8~7) 1 0 0 0 0 1 1 1
2、整型类型 整数类型: 基本型 int 短整型 short int、short 长整型 long int、long 无符号整型 unsigned int、 unsigned short unsigned long
3、整型变量的定义 变量定义的格式: 类型 标识符1[,标识符2][,标识符3]…… int main( ) {int a; int b,c,d; a=12; b=13; c=a*b; d=a+b; printf(“a*b=%d,a+b=%d\n”,c,d); return 0; }
标识符 用作:变量名、符号常量名、 函数名、数组名、类型名 规定:以字母或下划线打头 由字母、数字、下划线构成 如:_mode User_name xyz
标识符 • 大小写敏感 • 不可以是数字开头 • 标识符要直观,能表达它的功能(见名知意) • 对于由多个词构成的标识符,通常在两个词之间加上下划线或每一个词的第一个字母大写 • variablename • variable_name, VARIABLE_NAME • VariableName, variableName • 关键字(keyword)不可作为标识符 • int, float, for, while, if等 • 某些功能的变量采用习惯命名 如:for语句所采用的循环变量习惯用i, j, k
1、变量必须先定义后使用 • 2、定义变量的含义: • 规定变量的名字(区分其他变量) • 规定变量的类型(存储空间、存储方式、 • 取值范围、可以进行的操作) • 3、变量总是有值的 • (不被初始化的变量,其值为危险的随机数) int one; short x=6; 值可能会改变的数据----变量
4、整型常量 在程序运行过程中,其值不能被改变的量称为常量。 直接常量:从其字面形式即可判别的常量。 符号常量:用一个标识符代表的一个常量。 十进制数 八进制数: 以0开头的数 十六进制数:以0x开头的数 12、32767、32790、 0x64、10、010
2.3实型数据 • 1、实数的存储形式 • 实数采用指数形式存储,例如:123.456可以写成标准化指数形式0.123456,它包括前后两个部分,前面部分是数值部分,后面部分是指数部分。 0.123456 数值部分 指数部分 说明:标准化指数形式:其数值部分是一个小数,小数点前的数字是零,小数点后的第一位数字不是零。一个实数可以有多种指数表示形式,但只有一种属于标准化指数形式
0.85*1023 实数存储结构为: 指数部分 实数的符号位 数值部分
2、实型常量 十进制形式:由数字和小数点组成 小数点不能少 0.735 2.146 .5367 897. 指数形式:用e表示10,e后为整数 e前数字不能少 0.7e5 2.1e6 .5e3 89e-7 e5
取值范围 精度 区分 3、实型变量 单精度float 4 byte 3.4E-38~3.4E+38 双精度double 8 byte 1.7E-308~1.7E+308 内存的存储精度不同(7,15~16) 如: float a; a=111.111;
实型数据提供的有效数字位数 • float型数据提供7位有效数字 • double型数据提供16位有效数字 • 使用不当导致舍入误差 #include <stdio.h> main() { float a; double b; a = 123456.789e4; b = 123456.789e4; printf("%f\n%f\n",a,b); }
2.4 字符型数据 2.4.1. 字符的存储方式 • 字符包括字母(如A,a,X,x)、专用字符(如$,@,%,#)等。 • 计算机并不是将该字符本身存放到存储单元中(存储单元只能存储二进制信息),而是将字符的代码存储到相应的存储单元中。 • 附录A是字符与代码的对照表,这是国际通过的ASCII代码.
0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 0 0 1 1 1 0 1 部分字符的ASCII码 + 0 A a -
2.4.2 字符常量和字符变量 • 字符常量 • (1)用单引号包含的一个字符是字符型常量 • (2)只能包含一个字符 ‘a’,’A’, ‘1’ ‘abc’、“a” 例
有些以“\”开头的特殊字符称为转义字符 \n 换行 \t 横向跳格 \r 回车 \\ 反斜杠 \ddd ddd表示1到3位八进制数字 \xhh hh表示1到2位十六进制数字 • printf("tg\n"); • c=‘\n’; • printf(“%c”,c);
2. 字符变量 • 字符型变量用来存放字符常量,注意只能放一个字符。 • 字符变量的定义形式如下:char c1,c2; • 在本函数中可以用下面语句对c1,c2赋值: • c1=‘a’;c2= ‘b’; • 一个字符变量在内存中占一个字节。
字符数据运算的简单例子 例题 2.4 逐个输出英文字母C,H,I,N,A。然后按反序输出,即A,N,I,H,C。 解题思路 可以把5个字母分别放在5个变量中,第1次按正序输出这5个字母,第2次按反序输出这5个字母。C语言提供字符型变量,用来存放字符数据。
编写程序 #include <stdio.h> void main() { char a='C',b='H',c='I',d='N',e='A'; /* a,b,c,d,e定义为字符变量 */ printf("%c%c%c%c%c\n",a,b,c,d,e); /* 顺序输出CHINA */ printf("%c%c%c%c%c\n",e,d,c,b,a); /* 反序输出CHINA */ } 说明: 1、第3行是定义字符变量a,b,c,d,e。字符要用单撇号括起来。一个字符变量放一个字母字符。 2、第4,5行输出5个字母。输出字符所用的格式说明为“%c”。 3、运行结果: CHINA ANIHC
3.字符数据与整型数据在一定条件下可以通用 • 一个字符常量存放到一个字符变量中,实际上并不是把该字符的字型放到内存中去,而是将该字符的相应的ASCII代码放到存储单元中。这样使字符型数据和整型数据之间可以通用。 注意: 一个字符数据既可以以字符形式输出,也可以以整数形式输出。
运行结果: • a b • 97 98 例2.5向字符变量赋以整数。#include <stdio.h>void main() {char c1,c2; c1=97; c2=98; printf(“%c %c\n”,c1,c2); printf(“%d %d\n”,c1,c2);} • 说明:在第3和第4行中,将整数97和98分别赋给c1和c2,它的作用相当于以下两个赋值语句: • c1=′a′;c2=′b′; • 因为’a’和’b’的ASCII码为97和98
例2.6大小写字母的转换#include <stdio.h>void main() {char c1,c2;c1=’a’; c2=’b’; c1=c1-32; c2=c2-32; printf(“%c %c″,c1,c2); } • 运行结果:A B • 说明:程序的作用是将两个小写字母a和b转换成大写字母A和B。从ASCII代码表中可以看到每一个小写字母比它相应的大写字母的ASCII码大32。C语言允许字符数据与整数直接进行算术运算。
2.4.3 字符串常量 • 字符串常量是一对双撇号括起来的字符序列. • 合法的字符串常量: • “How do you do.”, “CHINA”, “a”, “$123.45” • 可以输出一个字符串,如 • printf(“How do you do.”);
‘a’是字符常量,“a”是字符串常量,二者不同。‘a’是字符常量,“a”是字符串常量,二者不同。 • 如:假设C被指定为字符变量:char c • c=‘a’; • c=“a”;c=“CHINA”; • 结论:不能把一个字符串常量赋给一个字符变量。
C规定:在每一个字符串常量的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。C规定:在每一个字符串常量的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。 • C规定以字符’\0’作为字符串结束标志。 如:如果有一个字符串常量”CHINA” ,实际上在内存中是: 它占内存单元不是5个字符,而是6个字符,最后一个字符为’\0’。但在输出时不输出’\0’。
2.5 符号常量 常量的形式:直接常量与符号常量 #define PRICE30 int main( ) { int num, total; num=10; total=num*PRICE; printf(“total=%d”,total); return 0; } 值不会改变的数据----常量
2.5.1 为什么要用符号常量 例题 2.7 已知圆的半径为r,求圆周长c,圆面积s,圆球体积v。 解题思路 圆周长 圆面积 c=2 s= 有了以上公式就可以进行计算了
2.5 符号常量 编写程序 #include <stdio.h> void main() {double r=3.67,c,s,v; c=2*3.1415926*r; s=3.1415926*r*r; v=4/3*3.1415926*r*r*r; printf("c=%f\ns=%f\nv=%f\n",c,s,v); } 说明: 运行结果: c=23.059290 s=42.313797 v=155.291633
2.5 符号常量 说明: 程序中多次出现常数3.1415926,降低程序的可读性。可用一个符号来代表一个常量,如可以用一个符号名PI来代表圆周率3.1415926。这样就不必在每处都重复写3.1415926,而用PI来代表,这个PI就叫符号常量。#define PI 3.1415926
2.5 符号常量 2.5.2 符号常量的性质和使用方法 • #define不是C语句,该行的末尾没有分号。它是一个“预编译命令”。 • 不要把符号常量与变量混淆, 符号常量只是一个符号,不占存储单元。它只是简单地进行字符置换(如把字符PI置换为字符3.1415926)。不论置换的字符是否有含义都进行置换。 • 习惯上,符号常量名用大写,变量名用小写,以示区别。 • 使用符号常量的好处 • 含义清楚 • 在需要改变一个常量时能做到“一改全改”。
其他: (1)C语言规定,两个整型数据相除结果是整型。因此,4/3的值是整数1,而没有小数部分。可以改用实数,写成4.0/3.0。程序第6行改为 v=4.0/3.0*3.1415926*r*r*r;再编译和运行,得到正确的v值。 (2)可调用pow函数,求 r 3,其函数形式是pow(r,3),函数值是double型。
注意: • 变量定义: • C规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。 • 例如: • int a,b(指定变量a、b为整型) • unsigned short c,d;(指定变量c、d为无符号短整型) • long e,f;(指定变量e、f为长整型)
注意! • 不要对变量所占的内存空间字节数想当然 • 用sizeof获得变量或者数据类型的长度 • 现场演示程序的运行结果 #include <stdio.h> main() { printf("Data type Number of bytes\n"); printf("------------ ---------------------\n"); printf("char %d\n", sizeof(char)); printf("int %d\n", sizeof(int)); printf("short int %d\n", sizeof(short)); printf("long int %d\n", sizeof(long)); printf("float %d\n", sizeof(float)); printf("double %d\n", sizeof(double)); }
2.6 算术运算符和算术表达式 • 2.6.1 算术运算符 • (1)基本的算术运算符: • + (加法运算符,或正值运算符。如:3+5、+3) • - (减法运算符,或负值运算符。如:5-2、-3) • * (乘法运算符。如:3*5) • / (除法运算符。如:5/3) • % (模运算符,或称求余运算符,%两侧均应为整型数据,如:7%4的值为3)。
2.6 算术运算符和算术表达式 • (2) 运算符的优先级与结合性 • C语言规定了运算符的优先级 • 在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。 • C规定了各种运算符的结合方向(结合性) • 算术运算符的结合方向为“自左至右”,即先左后右 。
2.6 算术运算符和算术表达式 • (3)自增、自减运算符 • 作用是使变量的值增1或减1 • 如: • ++i,--i(在使用i之前,先使i的值加 • (减)1) • i++,i--(在使用i之后,使i的值加( • 减)1)