为什么这个uint32_t在内存中以这种方式排序?

时间:2016-08-27 13:42:35

标签: objective-c c

我正在学习字节序,我读到英特尔处理器通常都是小端的。我在英特尔Mac上,我想我会亲自尝试看看它的实际应用。我定义了一个uint32_t,然后尝试打印出4个字节,因为它们是在内存中排序的。

uint32_t integer = 1027;
uint8_t * bytes = (uint8_t*)&integer;
printf("%04x\n", integer);
printf("%x%x%x%x\n", bytes[0], bytes[1], bytes[2], bytes[3]);

输出:

0403
3400

我希望以相反的顺序(3040)或不变的方式看到字节,但是两者的输出都不是。我错过了什么?

我实际上正在使用Xcode将其编译为Objective-C,如果这有任何区别的话。

2 个答案:

答案 0 :(得分:3)

因为在当今的典型计算机中以字节为单位(8位)保存数据。

在使用little endian的机器中,第一个字节为03,第二个字节为04,第三个和第四个字节为00

第二行3中的第一个数字表示第一个字节,第二个数字4表示第二个字节。要显示每个字节有2位数的字节,请指定要以

格式打印的宽度
printf("%02x%02x%02x%02x\n", bytes[0], bytes[1], bytes[2], bytes[3]);

答案 1 :(得分:1)

这是字节序。

将数据存储在内存中有两种不同的方法。小端和大端。

在big endian中,首先存储最重要的字节。

在little endian中,首先存储最低有效字节。

您的系统是小端,因为数据存储为

03 04 00 00

在大端系统上,它本来是

00 00 04 03

打印时使用%02x打印前导零。