sizeof 数据对齐问题

(1)struct A 
{
       char t:4;
  char q:4;   //1
//       unsigned int i:8;
//   unsigned int j:8;
//   unsigned int a:8;
//   unsigned int b:8;
//   unsigned int c:8;
//   char k:4;
//       unsigned int m;
//   double n;
};

sizeof(A)=1;  两个4位 char数据组成一个字节

(2)struct A 
{
     char t:4;
     char q:4;  //1

     unsigned short r:8;  //2         对齐组合成4

      unsigned int i:8;//4
//    unsigned int j:8;
//    unsigned int a:8;
//    unsigned int b:8;
//    unsigned int c:8;
//    char k:4;
//       unsigned int m;
//    double n;
};
sizeof(A)=8;     两个4位 char数据组成一个字节与整型对齐为8个字节

(3)struct A 
{
           char t:4;
   char q:4;  //1                对齐成4         

    unsigned int i:8;//4

//    unsigned int j:8;
//    unsigned int a:8;
//    unsigned int b:8;
//    unsigned int c:8;
//    char k:4;
//       unsigned int m;
//    double n;
};
sizeof(A)=8;     两个4位 char数据组成一个字节与整型对齐为8个字节

(4)struct A 
{
           char t:4;
         char q:4;     //1         对齐组合成4
           unsigned int i:8;
   unsigned int j:8;
   unsigned int a:8;
   unsigned int b:8;   //4     这四句话组合成4
//    unsigned int c:8;
//    char k:4;
//       unsigned int m;
//    double n;
};
sizeof(A)=8;     两个4位 char数据组成一个字节与整型对齐,4个8位的整型数据组成4个字节,一共有8个字节

5)struct A 
{
           char t:4;
   char q:4;  //1      对齐组合成4
           unsigned int i:8;
   unsigned int j:8;
   unsigned int a:8;
   unsigned int b:8;   //4    对齐组合成4
   unsigned int c:8;    //4   对齐组合成4
   char k:4;               //1      对齐组合成4
//       unsigned int m; 
//    double n;
};

sizeof(A)=12; 

(6)struct A 
{
           char t:4;
   char q:4;        //1     对齐组合成4
           unsigned int i:8;
   unsigned int j:8;
   unsigned int a:8;
   unsigned int b:8;//4    对齐组合成4
   unsigned int c:8;//4    对齐组合成4
   char k:4;          //1       对齐组合成4
//       unsigned int m;
//    double n;
};sizeof(A)=16; 

(7)struct A 
{
           char t:4;
   char q:4;        //1     对齐组合成4
           unsigned int i:8;
   unsigned int j:8;
   unsigned int a:8;
   unsigned int b:8;//4     对齐组合成4
   unsigned int c:8;//4    对齐组合成4
   char k:4;          //4   对齐组合成4
          unsigned int m;  //4   对齐组合成4
//    double n;
};sizeof(A)=20; 

(8)struct A 
{
           char t:4;
   char q:4;        //1
           unsigned int i:8;
   unsigned int j:8;
   unsigned int a:8;
   unsigned int b:8;//4       // 对齐组合成8


   unsigned int c:8;//4
   char k:4;          //4              // 对齐组合成8


       unsigned int m;//4             // 对齐组合成8


   double n;                        //8
};sizeof(A)=32; 与8位double型数据对齐

总结:(1)当最高位为char型数据时,组合成char型数据,此时sizeof为1的整数倍

(2)当最高位为short型数据时,组合成short型数据,可以把其中的不够16位的同一种数据组合起来成16位,不同数据不能组合在一起,此时sizeof为2的整数倍

(3)当出现数据位最高为整型数据,也即32位数据,可以把其中的不够32位的同一种数据组合起来成32位,不同数据不能组合在一起,sizeof为4的整数倍

(4)当出现数据位最高为double数据,也即64位数据,可以把其中的不够32位的同一种数据组合起来成32位,同时可以把不同种数据组合成64位,ziseof为8的整数倍

(5)有符号和无符号数按同一种类型对待,long Int与int按同一种类型对待

(6)首先关注最高位,把相邻的数据组合成最高位。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值