大小端模式和栈生长方向:
首先 栈是向下生长的 所以画栈的时候 上面是高地址 下面是地地址; 然后数据从上往下画;
大小端:
---> 大端: 是指 数据的"高位" 保存在内存的"低地址"中, 而数据的"低位" 保存在内存的"高地址"中
---> 小端: 是指 数据的"高位" 保存在内存的"高地址"中, 而数据的"低位" 保存在内存的"低地址"中
从下面的程序 CheckAddr() 可以测试 "变量的地址"是由其地址的"低地址"决定的
从下面的程序 CheckCpuEndian() 可以测试 VS2013 是小端模式
两个变量在栈中的格局如下:
// 高地址
12H
34H
56H
78H // temp1 的地址
87H
65H
43H
21H // temp2 的地址
// 低地址
// 高位先入栈 但是高位是在高地址, 低位后入栈 但是低位在低地址, 所以是小端模式
#include <iostream>
#include <cstring>
bool CheckCpuEndian() //返回true,为小端;反之,为大端;
{
union
{
unsigned int a;
unsigned char b;
}c;
c.a = 1;
return 1 == c.b;
};
bool CheckAddr() // 返回 true 为低地址决定 否则为高地址
{
unsigned int a = 1;
unsigned char b = *( &a );
if( b == 1 )
{
return true;
}
return false;
}
int main( int argc, char *argv[] )
{
if( CheckAddr() == true )
{
std::cout << "Low" << std::endl;
}
if( CheckCpuEndian() == true )
{
std::cout << "Small Endian" << std::endl;
}
int temp1 = 0x12345678;
int temp2 = 0x87654321;
std::cout << &temp1 << std::endl;
std::cout << &temp2 << std::endl;
std::cout << temp1 << std::endl;
std::cout << temp2 << std::endl;
std::cout << *( &temp1 - 3 ) << std::endl;
system( "pause" );
return 0;
}