《C语言数据的存储解析.ppt》由会员分享,可在线阅读,更多相关《C语言数据的存储解析.ppt(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2.0 预备知识计算机中数的表示及进制转换v数码、基与权l数码:表示数的符号l基:数码的个数l权:每一位所具有的值v数制语言程序设计 第二章数据描述C数制基权表示数码特点10,10,10,十进制数0910逢十进一二进制数0122,2,2,逢二进一八进制数0788,8,8,逢八进一十六进制数09,AF,af1616,16,16,逢十六进一十进制:4956= 410+910 +510+610二进制:1011=12+02 +12+12十六进制:81AE=816+116 +1016+1416八进制:4275=48+28 +78+58语言程序设计 第二章数据描述Cv各种进制之间的转换l二进制、八进制、十
2、六进制转换成十进制u方法:按权相加10012345259212120212121111011)()(例10012894868381136)()(例1001231679781610162161516121)()(例AF语言程序设计 第二章数据描述Cv各种进制之间的转换(整数)l二进制、八进制、十六进制转换成十进制u方法:按权相加l十进制转换成二进制、八进制、十六进制u方法:连续除以基,从低到高记录余数,直至商为0例 把十进制数59转换成二进制数5922921427232120(59)10=(111011)21101111 1 1 0 1 1余余余余余余例 把十进制数159转换成八进制数15981
3、98280(159)10=(237)82 3 7 余 7余 3余 2例 把十进制数459转换成十六进制数4591628161160(459)10=(1CB)16余11余12余 1语言程序设计 第二章数据描述Cl二进制与八进制之间的转换u二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制u八进制转换成二进制:用3位二进制数代替每一位八进制数例 (1101001)2=(001,101,001)2=(151)8例 (246)8=(010,100,110)2=(10100110)2000 0001 1010 2011 3100 4101 5110 6111 7语言程序设计 第二章
4、数据描述Cl二进制与十六进制之间的转换u二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十六进制u十六进制转换成二进制:用4位二进制数代替每一位十六进制数例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)20000 00001 10010 20011 30100 40101 50110 60111 71000 81001 91010 A1011 B1100 C1101 D1110 E1111 F语言程序设计 第二章数据描述
5、C数值的表示方法计算机不论对正数和负数都按“补码”形式存放到存储单元。v原码:最高位为符号位,其余各位为数值本身的绝对值v反码:l正数:反码与原码相同l负数:符号位为1,其余位对原码取反v补码:l正数:原码、反码、补码相同l负数:最高位为1,其余位为原码取反,再对整个数加1语言程序设计 第二章数据描述C整型数据在内存中的存放形式数据在内存中是以二进制形式存放的。int i;i=10;int i;i=-10;-10的原码1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0取反1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1再加11 1 1 1 1 1 1 1 1 1 1
6、1 0 1 1 0-10的补码的反码-10数据类型总表C数据类型基本类型基本类型构造类型构造类型指针类型指针类型无值型无值型字符类型字符类型char枚举类型枚举类型enum整整 型型实型实型单精度型单精度型float双精度型双精度型double数组数组结构体结构体struct共用体共用体union短整型短整型short长整型长整型long整型整型int数据类型决定:1. 数据占内存字节数2. 数据取值范围3. 其上可进行的操作v内存以字节为单元组成v一个字节一般由8个二进制位组成v每个二进位的值是0或1以turbo c系统为例:int a,b; 2 Byte=16 bitChar c,d; 1
7、 Byte= 8 bitFloat e,f; 4 Byte=32 bitDouble g,h; 8 Byte=64 bit语言程序设计 第二章数据描述C整型变量的分类 整型变量的基本类型符为int。可以根据数值的范围将变量定义为基本整型、短整型或长整型。在int之前可以根据需要分别加上修饰符:short(短型)或long(长型)。因此有以下三种整型变量:(1)基本整型,以int表示。(2)短整型,以short int表示,或以short表示。(3)长整型,以long int表示,或以long表示。 为了充分利用变量的表数范围,可以将变量定义为“无符号”类型。对以上三种都可以加上修饰符unsig
8、ned,以指定是“无符号数”。如果加上修饰符signed,则指定是“有符号数”。如果既不指定为signed,也不指定为unsigned,则隐含为有符号。01 11 11 11 11 11 11 11int型:最大:3276710 00 00 00 00 00 00 00最小:-3276811 11 11 11 11 11 11 11unsigned int型:最大:6553500 00 00 00 00 00 00 00最小:0语言程序设计 第二章数据描述C整型数据类型(Turbo C系统 )类型 符号关键字数的表示范围所占字节整型有无(signed)int-3276832767 (-2152
9、15-1)(signed)short-3276832767(-215215-1)(signed)long(-231 231-1)unsigned int065535 (0216-1)04294967295 (0232-1)unsigned longunsigned short065535 (0216-1)整型数据运算程序举例(2-1.c)例 鸡兔同笼。在一个笼子里同时养着一些鸡和兔,你想了解有多少只鸡和多少只兔,主人对你说:我只告诉你鸡和兔的总头数是16和总脚数是40,你能不能自己计算有多少只鸡和多少只兔?解题思路设x代表鸡的数量,y代表兔的数量,总头数为h,总脚数为f。根据题意,可以列出下面
10、的方程式: x+y=h 2x+4y=f整理可得求鸡和兔数量的公式: y=(f-2h)/2 x=h-y#include “stdio.h”void main() int h,f,x,y; h=16; f=40; y=(f-2*h)/2; x=h-y; printf(“%d,%dn”,x,y);u整型常量 u实型常量 u字符常量 u字符串常量 2.1常常 量量v定义:程序运行时其值不能改变的量(即常数)v分类:&一.整型常量(整常数)v三种形式:l十进制整数:由数字09和正负号表示.如 12,-46,l八进制整数:由数字0开头,后跟数字07表示. 如012,024,-010l十六进制整数:由数字0
11、和小写字母x开头,后跟09, AF(字母不区分大小写)表示. 如0 x12,-0 x1AB0,-0 x12不合法:018,ox10,特殊:0例 30000 为int型 65536L 为long int 型v整型常量的类型l在整常量后加字母l或L,认为它是long int 型常量&二.实型常量(实数或浮点数)v有两种表示形式:l小数形式:(由数字和小数点组成,必须有小必须有小数点数点) 如0.25, -123.0, .5, 0.0 l指数形式:(e e或或E E之前必须有数字,之前必须有数字,之后的之后的指数指数必须为整数,且不能插入空格!)必须为整数,且不能插入空格!) 如123e3,123E
12、3,(用字母e和E代表以10为底的指数) 错误: e-5e-5 , 1.2E-3.51.2E-3.5 思考:常量1如何用指数表示?规范化的指数形式:在字母e或E之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。如2.3478e2,3.0999E5等都属于规范化的指数形式,而12.908e10, 0.4578E3不属于规范化的指数形式一个实数可以有多种指数表示形式:例如123.456可以表示为123.456e0、12.3456e1、1.23456e2、0.123456e3等等实型数据运算程序举例(2-6.c)例 分期付款的计算。张先生为购房,向银行贷款,贷款额为D元,每月准备还P元
13、,月利率为R,求需要多少个月才能还清。解题思路已知计算公式是 M= log10(P)-log10(P-D*R) log10(1+R)M是还清贷款所需月数。今假设D=324500元,P=3245元,R=0.8%。(公式中用到log函数,见附录E)#include stdio.h#includemath.hvoid main() int d,p; float r,m; d=324500; p=3245; r=0.008; m=(log10(p)-log10(p-d*r)/log10(1+r); printf(month=%fn,m); printf(total=%fn,m*p);转义字符及其含义:
14、转义字符含义nradddtbf“xhh转义字符含义换行回车(返回本行开头)响铃单引号13位8进制数代表的字符跳到下一个输出区(7列)退格换页反斜线双引号12位16进制数代表的字符&三.字符常量v定义:用单引号括起来的单个字符v字符常量的值:该字符的ASCII码值 见附录A如 101 -A 102 -B 376 - x61 -a 60 -0 483 -()如 A65 a97 048 32如 5 A ?v转义字符:反斜线后面跟一个字符或一个代码值表示例 转义字符举例main() printf(“Welcome); printf(“to C!);运行结果:(屏幕显示)Welcometo C!例 ma
15、in() printf(“WelcomentonC!n”); 运行结果:屏幕显示:Welcometo C!注意:转义序列实际上作为一个字符来对待, 但如果反斜线之后的字符和它不构成转义序列,则不起转义作用,将被忽略。例 转义字符举例printf(“ANbcnDEFn”); 运行结果:(屏幕显示)ANbcDEF_例 转义字符举例printf(“tabrcdnefghx”); 运行结果:(屏幕显示)c d _ _ _ _ _ a b efghxv字符常量与字符串常量不同字符常量与字符串常量不同&四四. .字符串常量字符串常量v定义:用双引号定义:用双引号(“”)(“”)括起来的字符序列括起来的字符
16、序列v存储:存储:每个字符串尾每个字符串尾自动自动加一个加一个 0 0 作为字作为字符串结束标志符串结束标志h e l l o 0例例 字符串字符串“hello”“hello”在内存中在内存中a a 0例例 a“a”例例 空串空串 “”“”0例: char ch; ch=“A”; 例: char ch; ch=A; 五.符号常量:用标识符代表常量u定义格式: #define 符号常量 常量如 #define PRICE 30一般用大写字母一般用大写字母是宏定义预处理命令,是宏定义预处理命令,不是不是C语句语句, 不必在行末加分号不必在行末加分号#include “stdio.h”#define
17、 PRICE 30void main() int num,total; num=10; total=num*PRICE; printf(total=%d,total);运行结果:total=300例 符号常量举例#include “stdio.h”void main() int num,total; num=10; total=num*30; printf(total=%d,total); 2.2 2.2变变 量量标识符v定义:用来标识变量、符号常量、数组,函数等的字符序列v组成:l只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线l大小写敏感l不能使用关键字v长度:最长32个字符v
18、命名原则:l见名知意l不宜混淆 如l与, o与0例:判断下列标识符号合法性sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char ab _above $123M.D.John3days#33char$123ab编译程序根据变量定义为其分配指定字节的内存单元.地址int a=1, b=-3,c;abc2字节2字节2字节地址地址.内存1-3随机数变量v概念:其值可以改变的量v变量名与变量值v变量定义的一般格式: 数据类型 变量1,变量2,变量n;v变量初始化:定义时赋初值 例: int a,b,c; float data;
19、决定分配字节数和数的表示范围合法标识符例: int a=2,b,c=4; float data=3.67; char ch=A; int x=1,y=1,z=1; int x=y=z=1; ()v变量的使用:先定义,后使用例1 int a; b=19; /Undefined symbol b in function main v变量定义位置:一般放在函数开头#include “stdio.h”void main() int a,b=2; float data; a=1; data=(a+b)*1.2; printf(“data=%fn”,data);变量定义可执行语句#include “std
20、io.h”voidmain() int a,b=2; a=1; float data; data=(a+b)*1.2; printf(“data=%fn”,data);&一一. .整型变量整型变量int a,b;int a,b;&二二. .实型变量实型变量vfloatfloat:占占4 4字节,提供字节,提供667 7位有效数字位有效数字vdoubledouble:占占8 8字节,提供字节,提供15151616位有效数字位有效数字&三三. .字符型变量字符型变量 char a,b;char a,b;v字符变量存放字符字符变量存放字符ASCIIASCII码码vcharchar与与intint数据
21、间可进行算术运算数据间可进行算术运算#include “stdio.h” /*2-5.c*/ void 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=%fn”,x,y);输出结果:x=99985.179688,y=100000.000000可以看出x有约1.5的误差,而y没有精度损失。例 a=D; /* a=68; */ x=A+5; /* x=65+5; */ s
22、=!+G /* s=33+71; */没有没有字符串变量字符串变量,用字符数组存储,用字符数组存储在内存中字符数据以ASCII码存储,它的存储形式就与整数的存储形式类似。这样使字符型数据和整型数据之间可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出。以整数形式输出时,直接将ASCII码作为整数输出。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。 例例 大小写字母的转换大小写字母的转换(2-2.c)(2-2.c)#include void main() char c1, c2;
23、c1=a;c2=b; c1=c1-32; c2=c2-32; printf(“c1=%c c2=%cn, c1, c2);printf(“c1=%d c2=%dn, c1, c2);运行结果:c1=A c2=B c1=65 c2=66例 (2-3.c) #define PRICE 12.5 main() int num=3; float total; char ch1,ch2=D; total=num*PRICE; ch1=ch2-A+a; printf(“total=%f,ch1=%cn”,total,ch1); 宏定义变量定义输出结果运行结果:total=37.500000, ch1=d2
24、.3不同类型数据间的转换不同类型数据间的转换隐式转换隐式转换v什么情况下发生什么情况下发生l运算转换运算转换-不同类型数据混合运算时不同类型数据混合运算时l赋值转换赋值转换-把一个值赋给与其类型不同的变量时把一个值赋给与其类型不同的变量时l输出转换输出转换-输出时转换成指定的输出格式输出时转换成指定的输出格式v运算转换规则运算转换规则: :不同类型数据运算时先不同类型数据运算时先自动自动转换转换成同一类型成同一类型doublefloatlongintchar,short低高说明:必定的转换运算对象类型不同时转换例 char ch; int i; float f; double d;ch/i +
25、 f*d - (f+i)intintdoubledoubledoubledoubledoubledoubleintintdoubledoubledoubledoubledoubledouble10+a +i*f - d/l例 int i; float f; double d; long l;字节少的数据转换成字节多的类型。上述类型转换是由系统自动进行的。显式转换(强制转换)显式转换(强制转换)v一般形式:一般形式:(类型名类型名)(表达式)表达式)例例 (int)(x+y)(int)(x+y) (int)x+y (int)x+y (double)(3/2) (double)(3/2) (int)3.6 (int)3.6 v说明:强制转换得到所需类型的中间变量,原变说明:强制转换得到所需类型的中间变量,原变量类型不变量类型不变 例 #include main() float f=3.6; int i; i=(int)f; printf(“f=%f,i=%d”,f,i); 结果:f=3.600000,i=3f类型仍为float型,值仍等于3.6结束结束
限制150内