鱼C论坛

 找回密码
 立即注册
查看: 2803|回复: 4

[已解决]大端小端问题,萌新求教

[复制链接]
发表于 2022-12-23 22:40:42 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

int main(void)
{
        int num = 0x12345678;
        unsigned char *p = (unsigned char *)&num;

        if (*p == 0x78)
        {
                printf("您的机器采用小端字节序。\n");
        }
        else
        {
                printf("您的机器采用大端字节序。\n");
        }

        printf("0x12345678 在内存中依次存放为:0x%x 0x%x 0x%x 0x%x\n", p[0], p[1], p[2], p[3]);

        return 0;
}

为何*p等于0x78,而p[0]却等于78,*p指的不是数组第一位数吗,怎么二者有区别?
最佳答案
2022-12-23 23:46:07
本帖最后由 jackz007 于 2022-12-23 23:50 编辑

       我们使用的电脑采用的是 Intel(或兼容) CPU,多字节数值在内存中采用 Little-Endian 编码,一个整型数占用 4 个字节,0x12345678 在内存中的实际储存顺序为:78 56 34 12,所以,* p 指向整型数 0x12345678 实际上指向的是 78 56 34 12,所以,p[0] = 78,p[3] = 12。
       * p = p[0],二者是一回事,只是表达形式有所不同而已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-23 23:46:07 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-12-23 23:50 编辑

       我们使用的电脑采用的是 Intel(或兼容) CPU,多字节数值在内存中采用 Little-Endian 编码,一个整型数占用 4 个字节,0x12345678 在内存中的实际储存顺序为:78 56 34 12,所以,* p 指向整型数 0x12345678 实际上指向的是 78 56 34 12,所以,p[0] = 78,p[3] = 12。
       * p = p[0],二者是一回事,只是表达形式有所不同而已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-24 09:56:56 | 显示全部楼层
int num = 0x12345678 这个数在内存中存放的顺序是(小端) 78 56 34 12
unsigned char *p = (unsigned char *)#  把p指向了num的开始地址,也就是78这个位置
*p和p[0]是同一个字节的数据,注意一下,最后打印p[0]的时候用的是%x,所以打印出来是78,这里的78就是0x78,都是16进制数

点评

我很赞同!: 0.0
我很赞同!: 0
作者不理解的和大小端没关系,你应该是没看懂最后输出的是十六进制的显示形式,p[0]就是0x78.  发表于 2022-12-24 11:07
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-24 12:04:54 | 显示全部楼层
%x是打印一个数的16进制

你直接说p[0]等于78是错误的。

你的p[0]是按照   %x    打印的也是16进制78,*p也是16进制78,是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 00:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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