C语言printf函数中%hhu格式说明符的行为不一致问题咨询
%hhu格式说明符的跨编译器行为差异问题 核心原因:编译器对C99标准格式说明符的支持程度不同
%hhu是C99标准新增的格式说明符,用于指定将参数按unsigned char类型处理输出。你的测试结果差异,本质是不同编译器对C99该特性的实现支持不一致:
OnlineGDB使用的是较新版本的GCC,完全兼容C99标准:
按照C标准,传入printf的unsigned char或小整数会被默认提升为int,%hhu会告诉printf把提升后的int值先截断转换为unsigned char再输出。所以65535会被截断为unsigned char的最大值255,65536截断为0,符合你的预期。CodeBlocks(多搭配老版本MinGW)和TCC的部分版本,对C99的
%hh系列格式说明符支持不完善:
这些编译器可能仍基于C89标准(C89中没有%hhu,只有%hu对应unsigned short),或者对C99该特性的实现存在bug,导致%hhu被错误解析为%hu(对应unsigned short)。此时65535正好是unsigned short的最大值,所以直接输出65535;65536超过unsigned short范围,取模后输出0,和%hu的行为完全一致。
验证与解决方法
如果要确认问题,你可以在CodeBlocks中修改编译选项,强制开启C99标准(比如在编译器设置中添加-std=c99参数),再测试代码,此时%hhu应该能正常工作。对于TCC,需要升级到支持C99的新版本,或者避免在该编译器中使用%hhu,改用手动截断的方式,比如:
printf("%u\n", (unsigned char)65535);
这样无论编译器是否支持%hhu,都能得到正确的unsigned char范围输出。
内容的提问来源于stack exchange,提问作者entropicdecay

