You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:25:57