话不多说,直接插入代码。
以 int a = 0x12345678为例
请注意,0x12是数据的高地址,0x78是数据的低地址。
如果是大端,在内存中(按照低地址内存到高地址内存),保存如下:0x12,0x34,0x56,0x78
即数据的高地址保存在内存的低地址,按照保存顺序,是符合阅读习惯的。
比如你敲击int a = 0x12345678的代码,肯定是按照12345678的顺序输入。
如果读取这4字节的内存,显示的和你输入的一样,就是大端。
如果是小段,在内存中(按照低地址内存到高地址内存),保存如下:0x78,0x56,0x34,0x12
即数据的低地址保存在内存的低地址,按照保存顺序,需要转换才能按照写的顺序进行阅读。
#include <windows.h> #include <iostream> #include <string> using namespace std; static union { char c[4]; unsigned long l; } endian_test = { { 'l', '?', '?', 'b' } }; #define ENDIANNESS ((char)endian_test.l) int main() { cout<<"大小端: "<<ENDIANNESS<<endl; int a = 0x12345678; cout<<"a地址 "<<&a<<endl; char str[4]; memcpy(str,(&a),4); cout<<"str地址 "<<&str<<endl; cout<<"以下输出str"<<endl; for(int i=0;i<4;i++) { printf("%x %x\n",str[i],(str+i)); } cout<<"以下输出a"<<endl; printf("%x %x\n",*(char*)(&a),(char*)(&a)); printf("%x %x\n",*((char*)(&a)+1),((char*)(&a)+1)); printf("%x %x\n",*((char*)(&a)+2),((char*)(&a)+2)); printf("%x %x\n",*((char*)(&a)+3),((char*)(&a)+3)); }
运行结果如图: