基础知识点

c++中union的使用

union主要是共享内存,分配内存以其最大的结构体或对象为大小,即sizeof最大的。

在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也
可以使用联合体来发挥其长处。

union myun {
    struct {int x; int y; int z;}u;
    int k;
}a;

int main(int argc, const char * argv[]) {

    a.u.x = 4;
    a.u.y = 5;
    a.u.z = 6;
    
    a.k = 0;
    printf("%d %d %d\n", a.u.x, a.u.y, a.u.z);
    return 0;
}

union类型是共享内存的,以size最大的结构作为自己的大小,这样的话,myun这个结构就包含u这个结构体,而大小也等于u这个结构体 的大小,在内存中的排列为声明的顺序x,y,z从低到高,然后赋值的时候,在内存中,就是x的位置放置4,y的位置放置5,z的位置放置6,现在对k赋 值,对k的赋值因为是union,要共享内存,所以从union的首地址开始放置,首地址开始的位置其实是x的位置,这样原来内存中x的位置就被k所赋的 值代替了,就变为0了,这个时候要进行打印,就直接看内存里就行了,x的位置也就是k的位置是0,而y,z的位置的值没有改变,所以应该是0,5,6

大小端模式

  1. 试题一:编写一段程序判断系统中的CPU是 Little endian 还是 Big endian模式?
    注:Little endian 和 Big endian 是CPU存放数据的两种不同方式
  • 大端模式:是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点类似于把数据当做字符串顺序处理:地址由小增向大增加,而数据从高位往低位放;

  • 小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

举个,比如数据0x12 34 56 78 在内存中的表示形式为:

大端模式(Big-endian)
低地址------>高地址
0x12 | 0x34 | 0x56 | 0x78

小端模式(Little-endian)
低地址------>高地址
0x78 | 0x56 | 0x34 | 0x12

  • 小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
  • 大端模式 :符号位的判定固定为第一个字节,容易判断正负。

答案:

bool isBigEndianOfTwice() {
    union NUM {
        int a;
        char b;
    }num;
    
    num.a = 0x12345678;
    if (num.b == 0x12) {
        return true;
    }
    return false;
}

你可能感兴趣的:(基础知识点)