c++ - 大端方式小端方式编程判断
PHP中文网
PHP中文网 2017-04-17 13:05:51
0
6
855

编程判断大端方式还是小端方式
我自己的理解和代码如下:
如果数字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中文网

认证高级PHP讲师

全員に返信(6)
小葫芦

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
黄舟
int isBigEndian() {
    int num = 1;
    char* ch = &num;
    if (ch[0] == 1) 
        return 0;  //little
    else
        return 1;
}
いいねを押す +0
Ty80

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

いいねを押す +0
小葫芦

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

いいねを押す +0
Peter_Zhu

我在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
洪涛

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート