存储模式: 计算机的存储空间是按照字节寻址的,多字节的数据在存储空间上是连续的,其数据对象的地址等同于其最低位字节的地址。

例如:int a ;一个 int类型的变量占4个字节,假设变量的地址是0x1000(a),则这个变量所占4个字节的地址分别为:0x1000,0x1001,0x1002,0x1003.将一个整数存储在这个变量中时,哪个字节存在高位那个字节存在低位,根据系统而定,取决于系统的存储模式!

 大端模式(Big Endian):数据的高位存放在低地址字节中,地位存放在高地址字节中。

小端模式(Little Endian):数据的高位存放在高地址字节中,低位存在低地址字节中。

写个程序测试一下:

  1 #include<stdio.h>
  2 
  3 /*检测内存是大端模式还是小端模式
  4  *大端模式:顺着输出a,即为:数据的高位在内存的低地址字节中
  5  *小段模式:反着输出a,即为:数据的高位在内存的高地址字节中
  6 */
  7 
  8 
  9 main()
 10 { 
 11         int a;
 12         char *p;
 13         a=0x12345678;
 14         p=(char *)&a;
 15         printf("%#x\n",*p);
 16         printf("%#x\n",*(p=p+1));
 17         printf("%#x\n",*(p=p+1));
 18         printf("%#x\n",*(p=p+1));
 19 }

输出:

0x78
0x56
0x34
0x12

所以是小端模式,数据的低位78,存在内存低地址字节中p开始为低地址。小端模式反着输出!0x12345678,输出78 56 34 12

 

 结构体: 结构体变量定义时,结构体内的每一个成员都单独占用自己的空间。存在字节对齐问题。

  1 #include<stdio.h>
  2 
  3 struct stp
  4 {
  5         char str[8];
  6         int a;
  7         float f;
  8 };
  9 struct stp st;
 10 struct stp1
 11 {
 12         char str[9];
 13         int a;
 14         float f;
 15 };
 16 struct stp1 st1;
 17 main()
 18 {
 19         printf("%d\n",sizeof(st));
 20         printf("%d\n",sizeof(st1));
 21 }

输出16,20.
why??看下面例子:

  1 #include<stdio.h>
  2 /* 结构体字节对齐,满足两个条件:1,成员起始地址%每个成员大小==0,如果
  3 不为0就补空字节,直到该条件满足。2,最后的结构体长度为结构体自身对齐值
  4 的整数倍(自身对齐值为结构体中最长的成员的长度),否则就补空字节*/
  5 
  6 /* 同样的结构体,成员按由大到小排列能够节省空间*/
  7 
  8 
  9 struct TestStruct1
 10 {
 11         char c1;
 12         short s;
 13         char c2;
 14         int i;
 15 }a;
 16 
 17 struct TestStruct2
 18 {
 19         int i; 
 20         short s;
 21         char c2;
 22         char c1;
 23 }b;
 24 
 25 main()
 26 {
 27         printf("%d\n",sizeof(a));
 28         printf("%d\n",sizeof(b));
 29 }

 输出12,8

共用体:共用体所有成员共用一块内存空间,所以数据成员具有相同的起始地址,所以,某段时间内只有一个成员其作用!按长度最大的成员分配空间。

例如:

  1 #include<stdio.h>
  2 
  3 union utp
  4 {
  5         char str[5];
  6         int a;
  7         float f;
  8 };
  9 union utp u;
 10 
 11 main()
 12 {
 13         u.a=1;
 14         printf("%c\n",u.str[0]);
 15 }

输出乱数。共用体元素共用一块地址,a的值为 0000 0000 0000 0001,因此str[0]的值为1的一个字节,是高位字节还是低位字节??根据电脑的存储模式定。若是小端模式:str[0]为0001.低位存在低地址当中。  因此输出0000对应的字符,%d的话输出1.

 

 

posted on 2013-03-15 21:07  秋天里的红苹果  阅读(181)  评论(0编辑  收藏  举报