我正在学习字节序,我读到英特尔处理器通常都是小端的。我在英特尔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,如果这有任何区别的话。
答案 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
打印前导零。