찾다

 >  Q&A  >  본문

c++ - 大端方式小端方式编程判断

编程判断大端方式还是小端方式
我自己的理解和代码如下:
如果数字0x12345678
那么大端方式从低地址到高地址依次存储 0x12 0x34 0x56 0x78
如果是小端方式的话从低地址到高地址依次存储 0x78 0x56 0x34 0x12
我的程序如下:

int main()
{
    unsigned int i=0x12345678;
    cout<<hex<<i<<endl;
    char *p=(char *)&i;
    if(*p==0x78)
        cout<<"little Endition"<<endl;
    else
        cout<<"Big Endition"<<endl;
    
    return 0;
}

结果输出却让我大跌眼镜

12345678
Big Endition

输出我有点看不懂,一般笔记本不都是大端方式吗?
还有一个问题,编程实现大端方式小端方式,我在网上搜了下还有用UNION联合体,没看懂,求解答。联合体不是在同一时刻只能存储一个变量吗,在给c.a赋值后,c.b怎么可能为1呢?

int checkCPU()
{
    {
        union w
        {
            int a;
            char b;
        }c;
        c.a = 1;
        return (c.b == 1);
    }
}

附上个人电脑信息:
MacBook Pro (Retina, 13-inch, Early 2015)
处理器 2.7 GHz Intel Core i5
编辑器 Xcode6

PHP中文网PHP中文网2802일 전844

모든 응답(6)나는 대답할 것이다

  • 高洛峰

    高洛峰2017-04-17 13:07:51

    c++看不懂,就说说union吧。假设int 是4个byte,那么当设置 c.a=1后,大端的话内存为 0x00000001, 因为高位都是0,最低位为01,内存从左往右地址是从低到高,符合大端定义高位字节在内存地址低位。
    小端则相反,内存中为 0x01000000。b为char,占一个字节,并且是低内存地址的一个字节,如果在小端模式,则为0x01, 大端模式为0x00。结论是如果 c.b==1 返回true, 则为小端。

    补充:Intel x86 processors 都是小端,现在大部分机器都是Intel的cpu吧。

    看懂c++了,结论没错,是小端的。

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 13:07:51

    int isBigEndian() {
        int num = 1;
        char* ch = &num;
        if (ch[0] == 1) 
            return 0;  //little
        else
            return 1;
    }

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 13:07:51

    联合体就是联合体内成员公用一块存储区,a用的空间也是b用的

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 13:07:51

    不要用编程去测试
    因为你无法控制编译器行为
    不同的编译器产生的机器码不同
    因为这些东西c++和c语言规范都没有明确规定
    请查阅cpu手册 这才是唯一的方式

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:07:51

    我在x86_64平台(Intel core i5-4590)上,用你的程序,的确测出了小端。
    (话说endian写法错了吧……)
    手上没MacbookPro可以试。
    没看出你的写法有甚么问题,只能说这结果很奇怪……

    下面说union的用法。
    union的意思是“这段内存数据的类型可能是以下其中一种:……”
    (编译器会自动分配一段内存,确保足够放下里面最大的类型)
    所以题中的union的意思,是指“c这个变量既可能是int,也可能是char”。
    而c.a就是“把c当作int看待”,c.b就是“把c当作char看待”。
    也就是说,c.a等价于(int)(&c),c.b等价于(char)(&c)。
    所以,先用c.a再用c.b是没问题的,你只是在不同时刻把c当成不同的类型进行操作而已。
    然后就和你写的程序没甚么分别了……

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 13:07:51

    Intel 处理器确实是小端的,谁告诉你笔记本是大端了.
    直接char跟多字节类型比较就好了..UNION可行,但是并没有什么卵用,脱裤子放屁的事

    회신하다
    0
  • 취소회신하다