Loading... <p> </p> <p>在学习C语言的过程中,有时候会想,数据到底是以什么样的方式在内存中存储的呢?经过一段时间的查阅资料,小编终于整理了一些……</p> <p>以VC6.0编译器为测试环境(int型为4Byte)</p> <p>先简介一下大小端模式,具体资料可参考</p> <p>http://blog.csdn.net/ce123_zhouwei/article/details/6971544</p> <p> </p> <p>简介一下:</p> <p>大端模式:Big-Endian</p> <p><span style="font-size: 14px">就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端</span></p> <p><span style="font-size: 14px">小端模式:Little-Endian</span></p> <p><span style="font-size: 14px">就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端</span></p> <p><span style="font-size: 14px">我们常用的x86系列cpu,就是小端模式存储方式的……</span></p> <p><span style="font-size: 14px">一、正整型</span></p> <p>正整型,没什么好说的,就是补码存储方式,正数的补码和原码相同,即先转换为二进制,然后高位扩展0,一直填充至32位……</p> <p>比如:5这个数的存储方式如下</p> <p>先转换为二进制:101</p> <p>因为只有3位,所以前面填充29个0,即 00000000 00000000 00000000 00000101</p> <p>二、负整型</p> <p>负整型,跟正整型一样,也是补码存储方式,不过负数的补码计算方式是取绝对值的二进制,按位取反再加1</p> <p>比如:-5这个数</p> <p>先取绝对值,即5,即 00000000 00000000 00000000 00000101</p> <p>然后按位取反:11111111 11111111 11111111 11111010</p> <p>再加1:即 11111111 11111111 11111111 11111011</p> <p>三、正浮点型</p> <p>浮点型中有两种,一种是4Byte的float型,一种是8Byte的double型,这两种计算方式都一致,只是有点点区别</p> <p>1、float型:</p> <p>float型是遵循IEEE R32.24规范,即1位符号位、8位阶码、23位尾数</p> <p>具体计算方式是先用科学计数法表示出该数的二进制,然后计算出阶码值,最后把尾数补足23位,依此存储</p> <p>比如125.5这个数</p> <p>先看整数部分,125表示成二进制是1111101,(整数转换二进制是除二取余)</p> <p>再看小数部分,0.5表示成二进制是0.1,(小数转换二进制是乘二取整)</p> <p>所以125.5用二进制表示就是1111101.1,转换成科学计数法就是1.1111011 x 2^6(阶数为6)</p> <p>但是这里的阶码是用移码的形式表示,float型的偏置量是127,于是6+127=133,即10000101</p> <p>这里前面的9位就出来了,因为是正数,所以符号位为0,阶码为10000101</p> <p>后面的尾数就是1111011,在后面补0,凑齐23位,即 1111011 00000000<br /> 00000000(因为科学计数法的整数部分总是为1,所以,这个1不用存储)</p> <p>所以125.5的存储方式为 0 10000101 11110110000000000000000</p> <p>即: 01000010 11111011 00000000 00000000</p> <p>2、double型</p> <p>double型跟float型计算方式类似,不过区别在于double型遵循IEEE R64.53规范</p> <p>a、double的符号位是1位,阶码为11位,尾数为52位</p> <p>b、double的偏置量是1023,而float是127</p> <p>四、负浮点型</p> <p>和上面一样,不过就是符号位用1表示,就这点小区别</p> <p>五、验证方式</p> <p>有两种验证方式,一种是用联合体的方法、一种是强制类型转换方法</p> <p>1、联合体法:</p> <p>可以定义一个联合体,比如</p> <p>union data</p> <p>{</p> <p> float a;</p> <p> char array[4];</p> <p>};</p> <p>那么可以对a赋值,然后依次输出数组array的各个元素,这样就可以验证</p> <p>2、强制类型转换法:</p> <p>float a;</p> <p>char *p=(char *)&a;</p> <p>这样,将a的地址强制转换为指向字符类型之后,赋值给指针p,后续再依次输出*p、*(p+1)、*(p+2)、*(p+3)的值,也可以进行验证</p> <p>参考资料:http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html</p> <p> </p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信