编程判断大端方式还是小端方式
我自己的理解和代码如下:
如果数字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
高洛峰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++了,结论没错,是小端的。
黄舟2017-04-17 13:07:51
int isBigEndian() {
int num = 1;
char* ch = #
if (ch[0] == 1)
return 0; //little
else
return 1;
}
高洛峰2017-04-17 13:07:51
不要用编程去测试
因为你无法控制编译器行为
不同的编译器产生的机器码不同
因为这些东西c++和c语言规范都没有明确规定
请查阅cpu手册 这才是唯一的方式
天蓬老师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当成不同的类型进行操作而已。
然后就和你写的程序没甚么分别了……
PHP中文网2017-04-17 13:07:51
Intel 处理器确实是小端的,谁告诉你笔记本是大端了.
直接char跟多字节类型比较就好了..UNION可行,但是并没有什么卵用,脱裤子放屁的事