Jialong's Blog
沉潜 自由 追寻幸福
测试机器大小端的方法
  • 小端法:低位字节存放在低地址,高位字节存放在高地址
  • 大端法:低位字节存放在高地址,高位字节存放在低地址

判断电脑大小端模式的方法:

方法一

C语言中的char和int:

在C语言中并没有char类型的常量,其实是用int类型表示char。举个例子:

char ch = 'a';
//分别输出ch的字符和对应的ascii码。即打印出的是字符或整数
printf("%c, %d", ch, ch);

输出结果为:a, 97

将int 48存起来,然后取得其地址,再将这个地址转为char* 这时候,如果是小端存储,那么char*指针就指向48;48对应的ASCII码为字符‘0’;

void judge1() {
    int i = 48;
    int* p = &i;
    char c = 0;
    c = *((char*)p);

    if (c == '0')
        cout << "小端" << endl;
    else
        cout << "大端" << endl;
}

方法二

定义变量int i=1;将 i 的地址拿到,强转成char*型,这时候就取到了 i 的低地址,这时候如果是1就是小端存储,如果是0就是大端存储。

void judge2() {
    int i = 1;
    char c = (*(char*)&i);

    if (c)
        cout << "小端" << endl;
    else
        cout << "大端" << endl;
}

方法三

联合体union是一种特殊数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共同体,但任何时候只能有一个成员带有值。

定义联合体,一个成员是多字节,一个是单字节,给多字节的成员赋一个最低一个字节不为0,其他字节为0 的值,再用第二个成员来判断,如果第二个字节不为0,就是小端,若为0,就是大端。

void judge3() {
    union
    {
        int i;
        char c;
    } un;
    un.i = 1;

    if (un.c == 1)
        cout << "小端" << endl;
    else
        cout << "大端" << endl;
}

最后修改于 2021-12-22