高位对应a.s[1] 这是通过什么原理规定的
高位对应a.s 这是通过什么原理规定的 #include <stdio.h>union U
{
char s;
short i;
};
int main(void)
{
union U u;
printf("u: %.8X\n", &u);
printf("u.s: %.8X\n", &u.s);
printf("u.s: %.8X\n", &u.s);
printf("u.i: %.8X\n", &u.i);
printf("u.i: %.8X\n", sizeof(u.i));
return 0;
}
u: 00AFF768
u.s: 00AFF768
u.s: 00AFF769
u.i: 00AFF768
u.i: 00000002
请按任意键继续. . .
#include <stdio.h>
union U
{
char s;
short i;
};
int main(void)
{
union U u;
printf("u: %.8X\n", &u);
printf("u.s: %.8X\n", &u.s);
printf("u.s: %.8X\n", &u.s);
printf("u.i: %.8X\n", &u.i);
printf("u.i: %.8X\n", sizeof(u.i));
u.i = 0x1234;
for(int i = 0; i < 2; ++i)
{
unsigned char *p = (unsigned char *)&u;
printf("%.8X -> %.2X\n", &p, p);
}
return 0;
}
u: 0027FA10
u.s: 0027FA10
u.s: 0027FA11
u.i: 0027FA10
u.i: 00000002
0027FA10 -> 34
0027FA11 -> 12
请按任意键继续. . . 人造人 发表于 2018-10-13 21:55
你这个保存的地址顺序是在intel机器上是对的,其它的就正好相反了 wwhywhy 发表于 2018-10-13 22:16
你这个保存的地址顺序是在intel机器上是对的,其它的就正好相反了
举一个反例给我看
这里应该是因为数据是小端存储的?即低位有效字节存在低地址,高位有效字节存在高地址 关于计算机的字节顺序:
一、字节序
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端(Little-endian)、大端(Big-endian)两种字节顺序。
小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;
大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。
二、分类及代表
现在主流的CPU,intel系列的是采用的little endian的格式存放数据;
而motorola系列的CPU采用的是big endian的格式存放数据;
举例说明,比如环境为32位机:
int i=1;
Big-endian方式下: 0x00 0x00 0x00 0x01
Little-endian方式下:0x01 0x00 0x00 0x00
地址: 1000 1001 1002 1003
若强制转换指针类型为char * ,并获取i的地址,即从地址起点截断1个字节(为1000处)(char*)&i 。此时
Big-endian方式下为:0x00
Little-endian方式下为:0x01
页:
[1]