测试8字节对齐

对十六进制和按位操作,总是糊涂,所以实际测试下:

我的理解,不一定全部正确:

32位的系统上,(都以32位系统为例)

一个int型是4个字节,所以0x3是 0x0003,四个字节,其中3代表一个字节(8个二进制位)00000011,0就是00000000了。

一个指针也是4个字节,这个程序里头打印 的很多都是指针类型的值:

比如 [5d2f70]  ,是4个字节的十六进制数。

对0x03取反,得到的也是一个十六进制的数: [fffffffc]

malloc出来的地址,多次运行,最后一个字节,都是0,所以每次与,都还是0,buf与prealbuf一直都是相等的。

不太懂了 。。。。。


#include
#include

typedef struct _RingBuffer{
        unsigned int *prealbuf;
        unsigned char *buf;
        unsigned int size;
        unsigned int capacity;
}RingBuffer;

void testAlign8(RingBuffer **prb,int capacity)
{
     RingBuffer *rb;
     rb=malloc(sizeof(RingBuffer));
     if(rb==NULL)
     {
        printf("not enough memory\n");
     }
     memset(rb,0,sizeof(RingBuffer));
     rb->capacity=capacity;
     rb->size=0;
     //预分配的内存的大小 
     rb->prealbuf=malloc(sizeof(char)*(rb->capacity+8));
     printf("rb->prealbuf is [%x] [%d] [%d] [%x]\n",rb->prealbuf,rb->prealbuf,(unsigned int )rb->prealbuf,(unsigned int )rb->prealbuf); 
     rb->buf=(unsigned char *)((unsigned int )rb->prealbuf&(~0x3));
     printf("1 rb->buf is [%x] ,~0x3 is [%d] [%x]\n",rb->buf,~0x3,~0x3);
     rb->buf=(rb->buf==(unsigned char *)rb->prealbuf)?rb->buf:rb->buf+8; 
      printf("2 rb->buf is [%x] \n",rb->buf);
     *prb=rb;
}

int main()
{
    RingBuffer *p;
    testAlign8(&p,8);
    system("pause");
    return 0;
}



rb->prealbuf is [5d2f70] [6106992] [6106992] [5d2f70]
1 rb->buf is [5d2f70] ,~0x3 is [-4] [fffffffc]
2 rb->buf is [5d2f70]
请按任意键继续. . .

测试8字节对齐_第1张图片



你可能感兴趣的:(c/c++)