第二节 数据存储与变量.doc_第1页
第二节 数据存储与变量.doc_第2页
第二节 数据存储与变量.doc_第3页
第二节 数据存储与变量.doc_第4页
全文预览已结束

下载本文档

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

文档简介

2.1 变量的声明与定义1. 如程序清单2. 1所示会不会报错?为什么?如果不会报错,又是输出什么结果?程序清单2.1变量的声明与定义#includestatic inta ;static intb ;int main( int argc , char *argv ) printf( %d%d n , a , b0 ) ; return 0 ;static int a = 8 ;static int b4;这个程序是不会报错的,并且连警告都不会出现。输出的结果是:80static int a ,这句程序是声明全局变量a;static int b,这句程序是声明全局数组变量b,并且是不完全声明,也就是可以省略数组下标。static int a = 8,这里才是定义全局变量a,static int b4,这里是定义全局变量b。2.2 局部变量与全局变量的较量1. 请问如程序清单2. 2所示输出什么?程序清单2.2局部变量与全局变量#includestatic int a = 8 ;int main( int argc , char *argv ) int a = 4 ; printf( %d n , a ) ; return 0 ;C语言规定,局部变量在自己的可见范围内会“挡住”同名的全局变量,让同名的全局变量临时不可见。即在局部变量的可见范围内不能访问同名的全局变量。因此本程序输出为:4。2.3 char、int、float、double的数据存储1. 请问如程序清单2. 3所示,i和j输出什么?程序清单2.3数据存储floati = 3 ;int j = *(int*)(&i) ;printf(i = %f n, i ) ;printf(j = %#x n, j ) ;i是毋庸置疑是:3.000000。但是j呢?3.000000?答案是否定的,j是输出:0x4040 0000。有人会问了,难道j是随机输出?瞎说,j输出0x4040 0000是有依据,是一个定值!由于i是float数据类型,而j是int数据类型。理论上说,j是取了i的地址然后再去地址,应该得到的就是i的值:3。但是问题的关键就是float数据类型的存储方式和int数据类型不一样,float是占用4个字节(32位),但是float存储是使用科学计数法存储,最高位是存储数符(负数的数符是0,正数的数符是1);接下来8位是存储阶码;剩下的23位是存储尾数。上面i=3.000000,那么3.000000(10进制) = 11(2进制) = v:shape id=_x0000_i1027 style=WIDTH: 40.5pt; HEIGHT: 21.75pt equationxml= 121.1 脳 (二进制)。数据在电脑中存储都是二进制,这个应该都没有疑问。那么这里的数符为:0,阶码为:E 127 = 1,那么阶码为:E = 128 即为:1000 0000 (2进制),尾数为:100 0000 0000 0000 0000 0000。那么存储形式就是:0100 00000100 0000 0000 0000 0000 0000。这个数据转换成16进制就是0x4040 0000。char、int、float、double的存储方式如图2. 1所示。提问:如果i = -3.5 的话,请问j输出多少?i = -3.500000j = 0xc0600000这个希望读者自行分析。再问:如果如程序清单2. 4所示。程序清单2.4数据存储doublei = 3 ;int j = *(int*)(&i) ;printf(i = %lf n, i ) ;printf(j = %#x n, j ) ;这样的话,j又输出多少呢?提示:double(8个字节(64位)的存储方式是:最高位存储数符,接下来11位存储阶码,剩下52位存储尾数。是不是得不到你想要的结果?double是8个字节,int是4个字节。一定别忘记了这个。用这个方法也同时可以验证大小端模式!2.4 容易忽略char的范围1. 如程序清单2. 5所示,假设&b=0x12ff54,请问三个输出分别为多少?程序清单2.5char的范围unsignedintb = 0x12ff60 ;printf( (int)(&b)+1 ) = %#x n, ( (int)(&b)+1 ) ) ;printf(*( (int*)( (int)(&b)+1 ) )= %#x n, *( (int*)( (int)(&b)+1 ) ) ) ;printf(*( (char*)( (int)(&b)+1 ) ) = %#x n, *( (char*)( (int)(&b)+1 ) ) ;很显然,&b是取无符号整型b变量的地址,那么(int)(&b)是强制转换为整型变量,那么加1即为0x12ff54+1=0x12ff55。所以( (int)(&b)+1 )是0x12ff55。由于( (int)(&b)+1 )是整型数据类型,通过(int *)( (int)(&b)+1 )转化为了整型指针类型,说明要占4个字节,即为:0x12ff55、0x12ff56、0x12ff57、0x12ff58,再去地址*( (int *)( (int) (&b)+1 ) )得到存储在这4个字节中的数据。但是很遗憾,0x12ff58我们并不知道存储的是什么,所以我们只能写出0x*0012ff。*表示存储在0x12ff58中的数据。如图2. 2所示。以此类推,*( (char *)( (int) (&b)+1 ) ) = 0xff。如图2. 3所示。但是,*( (char *)( (int) (&b)+1 ) )输出的却是:0xff ff ff ff !问题出现了,为什么*( (char *)( (int) (&b)+1 ) )不是0xff,而是0xff ff ff ff?char型数据应该占用1个字节,为什么会输出0xff ff ff ff?使用%d输出,printf(*( (char*)( (int)(&b)+1 ) ) = %d n, *( (char*)( (int)(&b)+1 ) ) ) ;结果为-1?问题出在signed char 的范围是:-128127,这样肯定无法储存0xff,出现溢出。所以将printf(*( (char*)( (int)(&b)+1 ) ) = %#x n, *( (char*)( (int)(&b)+1 ) ) ) ;改成printf(*( (unsigned char*)( (i

温馨提示

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

评论

0/150

提交评论