小端字节序机器下十六进制输出缺失前导0的原因咨询
关于小端字节序测试中输出D而非0D的疑问解答
首先咱们先理清核心问题:你看到输出是D而非0D,这和字节序本身没关系——你的小端判断是对的,问题出在printf的格式化输出规则上。
为什么会输出D而不是0D?
你提供的代码里printf部分没写完,我猜你是用了%x或%X格式符但没指定补零规则。默认情况下,printf的十六进制格式符只会输出有效数字,不会自动补前导零。比如字节值是0x0D,用%X输出就会显示D,用%x会显示d,不会主动补上前面的0。
补全代码并验证小端结果
我把你的代码补全,让它能正确输出带前导零的十六进制字节值,方便你确认:
#include <stdio.h> union int2byte { unsigned char bytes[4]; unsigned int hex; }; int main(int argc, const char* argv[]) { union int2byte hexby; hexby.hex = 0xBAADF00D; printf("原始十六进制值:%#X\n", hexby.hex); int counter; for(counter = 0; counter < 4; counter++) { printf("第%d个字节:%02X\n", counter, hexby.bytes[counter]); } return 0; }
小端机器的输出解释
在小端字节序的机器上,unsigned int类型的0xBAADF00D会按低字节在前的顺序存在内存里,所以bytes数组的内容是:
bytes[0] = 0x0D(最低位字节)bytes[1] = 0xF0bytes[2] = 0xADbytes[3] = 0xBA(最高位字节)
代码里的%02X格式符是关键:
%02表示输出至少两位,不足两位时用前导零补齐X表示用大写十六进制字符输出
这样运行后,你就能看到第一个字节输出0D而不是D了。
总结
- 你的小端判断完全正确,输出
D只是默认格式化规则的问题 - 想要输出带前导零的两位十六进制值,记得用
%02x(小写)或%02X(大写)格式符
内容的提问来源于stack exchange,提问作者YangDev
相关产品推荐
相关产品推荐

