uint_fast16_t会阻止int转uint吗?两段C代码结果差异解析
问题解析:为何uint_fast16_t版本输出-1?
先看第一个程序的逻辑:
#include <stdio.h> #include <stdint.h> int main() { uint16_t result; uint16_t ui = 1; int16_t si = -1; result = si * ui; printf("%i", result); return 0; }
这段代码的输出符合预期:si和ui运算时会触发整数提升,在多数32位系统中两者都会被转为int类型,相乘结果是-1。赋值给uint16_t result时,-1按补码规则转为uint16_t的最大值65535,printf("%i")将其作为有符号int输出,显示65535。
再看第二个程序的问题:
#include <stdio.h> #include <stdint.h> int main() { uint_fast16_t result; uint16_t ui = 1; int16_t si = -1; result = si * ui; printf("%li", result); return 0; }
输出-1的原因不是result是有符号类型,而是printf格式符与变量类型不匹配:
uint_fast16_t是C标准定义的「最快的16位无符号整数类型」,多数系统中实际等价于uint32_t(32位无符号整数)。- 运算过程和第一个程序一致:
si * ui得到int类型的-1,赋值给uint_fast16_t result时,-1转为32位无符号整数的最大值4294967295。 - 但你使用了
%li格式符,它对应有符号long int类型。若系统中long int是32位,4294967295的二进制补码和有符号long int的-1完全相同,printf会按有符号数解析,因此输出-1。
要正确输出,需使用匹配无符号类型的格式符,比如包含inttypes.h头文件后,用printf("%" PRIuFAST16 "\n", result);,这样就能显示正确的无符号数值。
内容的提问来源于stack exchange,提问作者ilja
相关产品推荐
相关产品推荐

