C++---联合体(union)的一些测试

大小端模式

C++---联合体(union)的一些测试_第1张图片

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

测试

    union data
    {
        int a;    
        int b[2];
        float c;
        double d;
        char e[4];
    }test;

    test.a = 0x11223344;
    //test.c = 0x11223344;
    //test.d = 0x1122334455667788;
    printf("%d %d %d\n",sizeof(data),sizeof(test.c),sizeof(test.d));    // 8 4 8
    printf("%x %x %x %x\n",&test.e[0],&test.e[1],&test.e[2],&test.e[3]);// 28fe40 28fe41 28fe42 28fe43  
    printf("%x %x %x %x\n",test.e[0],test.e[1],test.e[2],test.e[3]);    // 44 33 22 11  
    printf("0x%x\n",test.b[0]);                                         // 0x11223344
    printf("0x%x\n",test.d);                                            // 0x11223344
    printf("0x%x\n",test.c);                                            // 0x80000000
    printf("0x%x 0x%x 0x%x 0x%x\n",&test,&test.a,&test.c,&test.d);      // 0x28fe40 0x28fe40 0x28fe40 0x28fe40
  1. 可以知道联合体变量test的地址和联合体内的成员的地址都是一样的
  2. 可以知道此机器为小端模式(网络传输:大端;Java:大端;ARM:大端;Intel:小端)
  3. 整个联合体的大小跟联合体内的最大的一个成员的大小相同
  4. int类型和float类型在内存中存放的格式是不一样的

你可能感兴趣的:(UNION,大小端,联合体,C-C++)