字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。
小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;
大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。
高、低字节
一般PC是低字节序,如果按平时书写习惯,从左到右是高位到地位的顺序,则例如0X12345678,在内存中的情况是
高地址
12
34
56
78
低地址
高地址:内存地址可以对应十六进制的数值,值大的为高地址,否则为低地址;
3. 总结
整数类型内部:低地址存储低位,高地址存储高位。
局部变量:先定义的高地址,后定义的低地址。
类,结构体,数组:先定义的低地址,后定义的高地址。
数组实际占用的空间,要比元素大,感觉上像是给数组名本身一个“指针类型”的空间,即4个字节。
intel处理器 小端模式
TCP/IP 大端模式
{http://yixiangongzhu.blog.163.com/blog/static/1973632032011111545140752/}
1. 下面程序输出是多少?
Union U {
char str[2];
short int num;
};
int main() {
U u;
u.str[0] = 10;
u.str[1] = 1;
cout << u.num << endl;
system("PAUSE");
return 0;
}
结果为266。对于整数类型,都是低字节存低位,高字节存高位,因此低位是10,高位是1,结果=1*256+10=266。
2. 下面不同变量之间地址大小关系
class Test {
public:
int m;
int n;
};
int main() {
int a;
char b;
int c[10];
Test t;
cout << (size_t)&a << endl;
cout << (size_t)&b << endl;
cout << (size_t)&c << endl;
cout << (size_t)&t << endl;
cout << (size_t)&t.m << endl;
cout << (size_t)&t.n << endl;
system("PAUSE");
return 0;
}
(size_t)&a > (size_t)&b > (size_t)&c > (size_t)&t.n > (size_t)&t.m = (size_t)t
2293612 > 2293611 > 2293552 > 2293548 > 2293544 = 2293544
a、b、c、t都是局部变量,在栈上存储,栈是从高地址到低地址,因此地址逐渐减小。结构体内部,先定义的地址小,后定义的地址大,这与类内的成员,数组总的元素,都是类似的。
此外,值得注意的是(size_t)&a-(size_t)&b=1,刚好是1个字节,即b的大小。(size_t)& b-(size_t)&c=59,这是因为首先需要字节对齐,补3个字节,从2293611,补到2293608,从2293607到 2293552剩下的44个字节是数组占用,注意数组只有10个元素是40个字节,还有4个字节应该是数组名占用的,把数组名看作一个指针?或者是数组名本身包含数组长度的信息,具体情况不是很清楚,不过int a[10]占用的空间是44个字节,而10个int类型的变量占用40个字节。t的字节分配很简单,没有什么了。
总的来说,具体的地址,需要考虑“栈的高地址到低地址”和“字节对齐”以及“数组”这样的特殊情况等等。