1.通过代码,查看计算机是小端模式还是大端模式。
这里使用了联合体union
联合体的大小是联合体所包含的最大的数据类型的大小。
int在这里是最大的数据类型(4字节)
char比int小一半(2字节)
当取union中的int时,取到整个union (1000 00002)
当取union中的char时,取到地址较低的部分(1000 或者 0002)
那么地址较低的部分是int中地址较高部分还是地址较低部分,就可以看出机器的存储方式了。
小端:低位地址存放数据的低位 比如:0x1000 0002 存放为 0002 1000 (数据高位1000 存放在高位地址(靠后))
大端:低位地址存放数据的高位 比如:0x1000 0002 存放为 1000 0002 (数据高位1000 存放在低位地址(靠前))
#include <iostream>
using namespace std;
union
{
int number;
short s;
}test;
bool testBigEndin()
{
test.number=0x01000002;
return (test.s==0x01);
/*
ox 0100(高地址) 0002(底地址)
大端:0100(底地址存高位) 0002(高地址存低位)
小端:0002(底地址村低位) 0100(高地址存高位)
*/
}
int main()
{
if (testBigEndin())
cout<<"big"<<endl;
else
cout<<"small"<<endl;
return 0;
}
2.计算机中数据的存放形式:
* 字符用asci码存放。int用补码,unsigned 用原码。注意机器的大小端法,字节顺序不一样的。又int是4个字节的。
* cpu架构决定了大小端模式,大端模式其实是平时生活中书写数字的顺序,先写高位,再写低位。
* 无论大小端,在取数时候是根据硬件将数据进行相应转换到可以正常使用的数据,这是依赖于硬件的。没有数据加载/存储的开销。
3.杂记
编译器会根据不同的变量类型生成不同的指令. 例如int a;
char c;
a = 100;
c = 100;
编译器知道a,c的类型, 可能会生成如下指令
mov DWORD PTR[EBP+8], 100
mov BYTE PTR[EBP+12], 100
运行时, CPU硬件逻辑根据指令中不同的操作码来产生不同的行为.
参考自:
https://blog.csdn.net/yiyeguzhou100/article/details/48381937 cpu架构决定大小端
https://www.cnblogs.com/diligenceday/p/5770783.html 基本数据类型