四、常数和数据的内存布局五、sizeof运算符六、变量_第1页
四、常数和数据的内存布局五、sizeof运算符六、变量_第2页
四、常数和数据的内存布局五、sizeof运算符六、变量_第3页
四、常数和数据的内存布局五、sizeof运算符六、变量_第4页
四、常数和数据的内存布局五、sizeof运算符六、变量_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 五、sizeof 运算符六、变 量第二章 基本元素、类型和概念1四、常数和数据的内存布局 文字常数是用若干字符序列构成的原始数据,简称为常数。常数具有三个基本特点: 1. 常数的类型; 2. 确定的值; 3. 常数不具备地址属性(字符串常数例外); 常数是一个可以在程序中作为值的一个数或若干有效字符。 常数是在程序中无须进行定义就可以直接使用的立即数。常数是不能修改的最简单的右值,用于初始化同类型的变量。2文字常数分为四种: 1. 实型常数; 2. 整型常数; 3. 字符常数; 4. 字符串常数; 常数是C/C+处理数据的可理解的原始材料,是二进制数等价的源头处的文本表示。 内存的数据状况是

2、二进制的,数据的原始状况或初始值通过常数确定。3(1)实型常数和内存布局 a. 实型数就是浮点型数。 浮点数是有符号的,由关键字 float、double和long double细分为单精度、双精度和长双精度三类。实型常数是一个有符号的十进制实数。实型常数的表示有两种形式:一是小数表示法,又称一般表示法;另一种为科学表示法或指数表示法。 小数表示法由必不可少的小数点和数字构成,格式为: 数字序列 . 数字序列 后缀 整数部分 小数部分 指数表示法e之前必须有数字e之后数字必须为整数,格式为: 数字序列 . 数字序列 e 数字序列 后缀 尾数部分 指数部分4 数字序列由数字 0123456789

3、 组成,前面可冠以+,-号,实型常数除非前面加有一个负号,否则是一个正数。 数字序列前的正号通常省略。方括号 中包括的内容表示可省略的部分。实数后缀为字母f, F, l, L之一。 没有后缀的实型常数具有缺省类型double。如果有f或F后缀,该常数的类型为float;如果有l或L后缀,其类型为long double。 scanf 函数读取数据时不添加后缀。 printf 函数也不保留后缀。后缀用于鉴别常数的确切类型。 可以省略小数点之前的数字.75 (该值的整数部分),或小数点之后的数字10.(小数部分),但不能都省略。 5 指数表示法尾数部分与指数部分构成,以10为底的幂次来确定数据的值。

4、 如: 尾数为一个字符序列后带小数点再带上小数部分的可选数字序列。当包括一个指数时可以省去小数点175e-2。 可以省略指数表示法的整数部分.0075e2,实型常数例子如下: float型: 10.f,1.575E1f ,2500E-6F; double型: 0.75 ,-0.0025,-2.5e-3; long double型: .0025L,25E-4l, 1575e-3l ,3.e5L; 下面的初始化定义语句表示了浮点变量和相应常数的严格匹配:float f = 1.575E1f; double d = 0.75; long double xd = 3.e5L;6 b. 浮点数的内存表示

5、 float型数据占32个bit, double型数据占64位,采用阶码或指数n和尾数m的形式来确定数值的转换: 单精度浮点数 双精度浮点数 最高位一般作为浮点数的符号位用于鉴别其正负。 阶码中有一个位则作为阶码的符号位简称阶符,浮点数的具体细节随机器略有变化。 单精度浮点数中最低的23位用来表示尾数m,中间的8位表示阶码或指数n,8位数的临界值(去掉一个符号位)微软的编译器定为27=128; 7双精度浮点数中最低的52位用来表示尾数m,中间的11位表示阶码或指数n,11位数的临界值微软的编译器定为210=1024,尾数m的范围介于0.5和1.0之间,由此浮点数大约的极限范围为: 指数或阶码则

6、限定了符点数的数据范围,小数部分的尾数和阶码如一起界定了符点数的精度。 8(或11)位阶码n 23(或52)位尾数m 上图为 32(或64)位浮点数的内存表示 8下面是float数的内存布局: 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 01 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 0 0s 0 0 0 1 1 1 1 0 010 1 1 1 1 1低地址 8位阶码 23位尾数 高地址 4字节float数的内存布局 二进制数9(2)整型常数和内存表示 a. 整型常数的表示 整型常数用十进制、八进制或十六

7、进制来表示。整型常数前加一个负号表示对其算术负运算的结果,其含义取决于特定的转换。整型常数的数字之间不能用空白字符分开。 1) 十进制常数格式为: 数字序列后缀 十进制语法的数字序列由数字0 1 2 3 4 5 6 7 8 9构成,不能0 开头。例如: 10,123,-32145 ,2456L, 3218u, 776712ul, 778899LU。 10 可省略的后缀为l, L, u, U。用 l,L表示整型常数为long类型。通过添加u或U表示整型常数为unsigned类型。小写字母l可能与数字1混淆。缺省类型一般处理为int类型。但没有一个界定short型整数的后缀。 2) 八进制常数格式

8、为: 0数字序列后缀 八进制语法的数字序列由数字0 1 2 3 4 5 6 7构成,必须0 开头。例如: 012,0203,-032145 ,024L,0117L, 0776745ul,034(28)。11 3) 十六进制常数格式为: 0 x数字序列后缀 十六进制语法的数字序列由数字0 1 2 3 4 5 6 7 8 9,字母a b c d e f A B C D E F构成,以0 x,或0X 开头。例如: 0 x1c (28),0 x0a,0X7ef,0 x7fffffL,-0 x3FFF。 下面的初始化定义语句表示了整型变量和相应常数的严格匹配: unsigned long ul=024u

9、L; int si= - 32145; unsigned int ui = 0 x9ff0u; 这样unsigned long 型的常数024uL严格匹配unsigned long函数的形参。而整型常数-32145, 0 x9ff0u可以匹配函数unsigned long型的形参,但涉及到数据的类型转换。12 b. 整数的内存表示 整型数(char,short,int,long) 分有符号和无符号两种,有符号整数其最高的位用于识别数的正负,最高位为0表示一个正数,1则表示负数。无符号整数的最高位作为数据的有效部分,位长n的无符号数的值由式子 an-12n-1+an-22n-2+a020 计算。

10、例如无符号8位数0 xff的值为 因此n位无符号整数的变动范围为:8位有符号数的表示范围是-128+127。n位有符号的整型数的变动范围为: 13 数据分整型数和浮点数两种,对于内存中以字节为单位的数据解释由于数据类型不同而不同。 同为4字节的内存数据由于对于位bit的映射不同,long型数据范围为: 32位无符号长整型的数变动范围为: 这比同为4字节的float型的极限范围:小,但精度却丝毫不差。 14 在32位的PC微机上数据的存放方式是低尾端形式的,即short型16位字节的低8位存放在内存的低地址处,高8bit存放在内存的高地址处,高尾端的存放方式则相反。 s 0 01 1 1 1 1

11、s 1 1 1 1 1 1 1 1 0 01 1 1 1 11 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0s 0 0 0 1 1 1 1 1 1 1 1 1 1 1 11 0 0 0 0 0 1 0 0 1 1 0 0 1 0 01 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1二进制数 高地址 低地址char shortlong 图为整数的内存布局(s对于有符号数作为符号判断指标,s取0对应正数)15(3)字符常数 字符常数是字符集里的一个字符。字符集包括ASCII字符集里所有可显示的字符以及换行符、水平制表、垂直制表、回车符等。字符常数有四种表现形式: a. 单

12、引号表示 例如: a, N, 5, +, 0, 1都是字符常数。 其中单引号作为定界符使用,并不表示字符常数本身。16 b. 特殊字符的转义序列表示 转义序列由一个反向斜杠后紧跟一个字母或数字构成。为了表示换行符、单引号或某些其它字符常数,必须使用转义序列。 转义序列一般用于指出动作,如在终端和打印机上的回车和制表移动,它们也用来提供非打印字符和有特定意义的字符,如双引号。水平制表符t在格式控制中表示水平右跳8个空格。例:单引号的表示为 。17 c. 八进制转义序列表示 在八进制转义序列ooo中只能使用07数字。八进制转义序列不能长于3个数字,十进制0255的八进制表示范围为000377。例如

13、: 字母A的八进制表示是101, ESC字符为033。 如果转义序列ooo中字符o是8以上的数字,则结果超出字符的数据范围。18 d. 十六进制转义序列表示 十六进制字符代码xhh 中使用09数字和字母af或AF,字母A可表示为x41反斜杠可表示为x5c。 数字字符0为x30, 0的ASCII值为0。小写c字符的ASCII值为0 x63。常数c, x63是同一个字符的不同表示方式。常数0 x6D和x6D存在细微的差异。 字符常数x6D不可以写为0 x6D,int型常数0 x6D不可以写为x6D。 在转义序列中的字符和普通字符赋给字符变量时,两侧加单引号。例如: char x=; char y=

14、; char z=023; char w=x04; char x=a;19 无单引号的格式具有另外的语义。例如:char x=a;不同于char x=a; 字符常数在内存中以ASCII值存储,即字符常数是占一字节内存的整数。这个ASCII值既可以字符的方式显示,也可以十进制方式显示,也可以16进制方式显示。 出现在表达式中的char数据则以ASCII值参加运算。a的ASCII值为97,a+3的值为100,这也是字符d的ASCII值。 小写字母ASCII值大于相应的大写字母,存在关系式x=X+32。2021(4)字符串常数 字符串常数是用双引号包括的一串字符。这串字符中不能简单地包括双引号“和反

15、斜杠,而单引号是可以的。 在转义序列中的字符位于字符串常数中时,两侧可不加单引号,单引号视为普通的字符。下面给出几个字符串常数: hello, program C+ , Ab143(相当于101bc) 其中双引号仅作为定界符使用,并不是字符串常数中的字符。22 字符串常数在内存中存储时,自动在其尾部追加一个0字符,0字符在ASCII码中,其代码值为0,称为空字符,也称为结束字符。 长度为n个字符的字符串常数,在内存中占用n+1个字节的空间。C/C+语言字符串常数具有这种特性,一般简称为字符串。例如: 字符串常数“hello”字面上具有6个字符。但存储在内存中时,如下所示占用7个字节空间即 si

16、zeof (“hello”)=6。 h e l l o 023(5)符号常数和 bool 型常数 常数是一串意义不确切的数据组合。 例如3.14159、96000,除了程序员知道这些数值的内在意义外,一般地只能把它们分别视为浮点数与整数。 因此值得把有意义的常数用一个符号来标定,让常数具有一定的语言含义,这样就产生了符号常数。符号常数是通过编译预处理指令# define来建立的,其语法格式为:# define 符号常数名 常数 或 # define 宏名 文本串24例如: #define PI 3.14159 这条指令把常数3.14159与圆周率PI相联系,此处宏名PI就是常数3.14159的

17、符号名,当程序进行编译预处理时,源程序中的符号PI,就用文本串3.14159代替,因此符号常数就是文字常数的一个名称。 替换宏名的文本串是字符集中若干字符的有序组合。C+中存在两个占一个字节的bool型常数,它们分别是关键字false(0)和true(1)。25五、sizeof运算符 sizeof是系统的关键字同时又作为常用的运算符。 sizeof运算符用于确定数据占有的内存空间大小,返回一个表达式或某一数据类型的字节数。它主要有两种语法格式: sizeof (e) 或者 sizeof e sizeof (type) type 是定义变量的数据类型, e是表达式。 类型type格式必须放在括号

18、中,表达式可以不用括号。sizeof 运算符的操作数既可以是内置数据类型,也可以是用户引入的数据类型或结构变量。26 sizeof在编译阶段就完成了计算处理,其结果作为无符号int常数。因而操作数实质上包含数据所占内存的静态大小。 下面是32位模式下的输出结果:sizeof (1.0f) = sizeof ( float) = 4, sizeof (1.0) = sizeof ( double ) = 8 sizeof 1 = sizeof(char)=1, sizeof 1 = sizeof ( int ) = 4 sizeof (x6D) = 1, sizeof (0 x6D) = 4。

19、sizeof (12) = 327六、变 量变量具有四个基本要素: 1. 变量类型 2. 变量的值 3. 变量的地址 4. 变量的存储属性; C/C+中名称(变量)是大小写敏感的,number与Number是不同的名称。在Windows编程中流行的命名规则为“匈牙利法”,该规则主要是为了提高程序的易读性,容易区分变量的类型,是否类的成员等;如: myBook , theStudent 28前缀i 或n l b c plpsszh m_ 含 义 int 型 near短整型 long型 bool型 char型 pointer 指针型 long pointer 长整型指针 string 字符串 st

20、ring zero零结尾的串 handle 句柄 member 类的成员 变量命名时前缀的含义 291.变量的定义任何一个变量在使用之前必须定义;变量定义语句具有下面的格式: 类名 变量名1,变量名2, , 变量名n; type v1, v2, , vn; 如: int i, j, k , l, m, n; /相当于int i; int j; int k; int l; int m; int n; float x, y, z; /相当于float x; float y; float z;302.变量的初始化 在定义变量的同时可给该变量赋一个初始值,变量的初始化常采用下面的形式: 类名 变量名=

21、表达式; type variable =expre; 表达式通常是常数,表达式一般应与变量具有相同的类型属性。例如,整型常数初始化整型变量,字符常数初始化字符变量,除非进行隐含的或显式的类型转换。例如: int i=0; char c=d; float x=3.456f; 整型变量i赋以初值0,字符变量c赋以初值b, 浮点型变量x赋以初值3.456。这几个变量的初始化在局部作用域(函数体界定的区域)中可以等价地分开写为: int i; i=0; char c; c=d; float x; x=3.456f;31 函数体中的变量位于堆栈空间,局部范围的初始化语句具有动态的性质。 而在全局范围初始化语句不能分开写。 变量一经初始化后就保持该值不变,除非变量重新赋值。 未经初始化的全局变量系统通常设置其为0,局部变量设置为不确定的随机值。 C+中在定义变量的时候赋初值也可采用另一种形式: int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论