sususususu 发表于 2022-12-23 22:40:42

大端小端问题,萌新求教

#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, p, p, p);

      return 0;
}

为何*p等于0x78,而p却等于78,*p指的不是数组第一位数吗,怎么二者有区别?

jackz007 发表于 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 = 78,p = 12。
       * p = p,二者是一回事,只是表达形式有所不同而已。

两手空空儿 发表于 2022-12-24 09:56:56


int num = 0x12345678 这个数在内存中存放的顺序是(小端) 78 56 34 12
unsigned char *p = (unsigned char *)&num;把p指向了num的开始地址,也就是78这个位置
*p和p是同一个字节的数据,注意一下,最后打印p的时候用的是%x,所以打印出来是78,这里的78就是0x78,都是16进制数

洋洋痒 发表于 2022-12-24 12:04:54

%x是打印一个数的16进制

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

你的p是按照   %x    打印的也是16进制78,*p也是16进制78,是一样的
页: [1]
查看完整版本: 大端小端问题,萌新求教