您的位置:首页 > 其它

对内存有了进一步理解!

2009-12-31 19:32 225 查看
#include <stdio.h>
union data
{
int i[2];
float a;
long b;
char c[4];
}u;
void main( )
{
scanf("%d%d",&u.i[0],&u.i[1]);
printf("I[0]=%d,I[1]=%d a=%f b=%ld c[0]=%d c[1]=%d c[2]=%d c[3]=%d",u.i[0], u.i[1],u.a,u.b,u.c[0], u.c[1], u.c[2], u.c[3]);
}
首先:共用体有8个字节的长度,用高4个字节、低4个字节来说明。
1.scanf("%d%d",&u.i[0],&u.i[1]); 输入10000 20000后,低4个字节内放10000,高4个字节放20000
转化为2进制是:00000000 00000100 00010100 00100000 00000000 00000000 00100111 00010000
I[0]=10000,I[1]=20000就不用说了。
2.看a的值:单精度float(4个字节)在内存中存储方式:31位是符号位 30--23位是指数位 22--0位是小数位(详细看C语言标准与设计),printf(“%f”,u.a),读内存的低4个字节,值应该是 2e(-126)(1.0000000 00100111 00010000b)由于float有效数字是6--7位,所以7位后面的没有意义所以a = 0.000000.
3.看b的值:long是长整型,存储方式与int相同,printf(“%ld”,u.b);按long的形式读低4个字节,所以b = 10000;
4.看字符数组c[4]的值: 首先,最好printf(“%d”,u.c[i]);用十进制比较清晰。
c[0]:占内存中最低的字节(最低的8位)就是:00010000转化为十进制是 16.
c[1]:占内存中次低的字节(次低的8位)就是:00100111转化为十进制是 39.
c[2]c[3]同理均为0.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: