一、前言
通过学习这两个要从内存这个方面来了解以下,所以小编准备了对这个问题的总结,通过对比学习会更加的深刻了解。
二、内容要点
union – 联合体,它的成员共享同一内存,内存分配时,考虑占内存最多的那个成员。
struct – 结构体,它的每个成员都有自己的内存空间,但空间在同一区域块,分配时还考虑4字节对齐(即不满4的倍数时,凑满到4的倍数)。
三、代码示例
#include<stdio.h>
main()
{
union
{
char c;
int i;
float a ;
} test; // float 最长,为4 字节。分配4字节。
struct t
{
int i;
char c;
float a;
}test2; //i 4 字节, c 1 字节, a 4字节, 共需 9 字节,考虑 4 字节 对齐,分配 12 字节。
int j;
test.i=0x1234;
test.c='A'; //A对应的16进制的ASCII码为41H
printf("%x\n",test.i);
printf("%c\n",test.c);
printf("%d %d \n",sizeof(test),sizeof(test2));
scanf("%x",&j);
}
运行结果:
分析:
小编直接做的时候就写的是1234 ,显然是不对的,没有理解到union的作用。对于本题,int 是4字节, float是4字节,都是最大的,所以这个union的联合体就是4字节。当我们把test.i=0x1234 存入内存的时候,会现存低字节的34,然后在存储高字节的12,当我们存完后结果暂时是3412;后来我们又存储了test.c=’A’,A对应的16进制的ASCII码为41H,所以就会把低字节的34挤掉,结果就变成了1241.
四、小结
C语言-数据类型大小总结:
变量的长度(VC6环境下)
1Byte =8bit ,一字节等于8位。
类型 | 大小(32位机)(Byte 字节) | 范围(Byte 字节) |
---|---|---|
char | 1 | 128 ~ +127 |
short | 2 | -32767 ~ + 32768 |
int | 4 | -2147483648 ~ +2147483647 |
long | 4 | 0~0xffffffffUL |
float | 4 | +/- 3.40282e+038 |
double | 8 | 1.7 * 10^308 |