鱼C论坛

 找回密码
 立即注册
查看: 1446|回复: 6

[已解决]高位对应a.s[1] 这是通过什么原理规定的

[复制链接]
发表于 2018-10-13 21:45:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
高位对应a.s[1] 这是通过什么原理规定的
最佳答案
2018-10-14 15:17:10
关于计算机的字节顺序:
一、字节序

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端(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[0] 。此时

Big-endian方式下为:0x00

Little-endian方式下为:0x01
webwxgetmsgimg.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-13 21:52:14 | 显示全部楼层
  1. #include <stdio.h>

  2. union U
  3. {
  4.         char s[2];
  5.         short i;
  6. };

  7. int main(void)
  8. {
  9.         union U u;
  10.         printf("u: %.8X\n", &u);
  11.         printf("u.s[0]: %.8X\n", &u.s[0]);
  12.         printf("u.s[1]: %.8X\n", &u.s[1]);
  13.         printf("u.i: %.8X\n", &u.i);
  14.         printf("u.i: %.8X\n", sizeof(u.i));

  15.         return 0;
  16. }
复制代码

  1. u: 00AFF768
  2. u.s[0]: 00AFF768
  3. u.s[1]: 00AFF769
  4. u.i: 00AFF768
  5. u.i: 00000002
  6. 请按任意键继续. . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-13 21:55:25 | 显示全部楼层
  1. #include <stdio.h>

  2. union U
  3. {
  4.         char s[2];
  5.         short i;
  6. };

  7. int main(void)
  8. {
  9.         union U u;
  10.         printf("u: %.8X\n", &u);
  11.         printf("u.s[0]: %.8X\n", &u.s[0]);
  12.         printf("u.s[1]: %.8X\n", &u.s[1]);
  13.         printf("u.i: %.8X\n", &u.i);
  14.         printf("u.i: %.8X\n", sizeof(u.i));

  15.         u.i = 0x1234;
  16.         for(int i = 0; i < 2; ++i)
  17.         {
  18.                 unsigned char *p = (unsigned char *)&u;
  19.                 printf("%.8X -> %.2X\n", &p[i], p[i]);
  20.         }

  21.         return 0;
  22. }
复制代码

  1. u: 0027FA10
  2. u.s[0]: 0027FA10
  3. u.s[1]: 0027FA11
  4. u.i: 0027FA10
  5. u.i: 00000002
  6. 0027FA10 -> 34
  7. 0027FA11 -> 12
  8. 请按任意键继续. . .
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
大可爱 + 5 + 5 + 2 用事实说话

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-10-13 22:16:52 | 显示全部楼层

你这个保存的地址顺序是在intel机器上是对的,其它的就正好相反了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-13 22:20:08 | 显示全部楼层
wwhywhy 发表于 2018-10-13 22:16
你这个保存的地址顺序是在intel机器上是对的,其它的就正好相反了

举一个反例给我看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-14 10:28:20 | 显示全部楼层
这里应该是因为数据是小端存储的?即低位有效字节存在低地址,高位有效字节存在高地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-14 15:17:10 | 显示全部楼层    本楼为最佳答案   
关于计算机的字节顺序:
一、字节序

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端(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[0] 。此时

Big-endian方式下为:0x00

Little-endian方式下为:0x01
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 06:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表