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

为何unsigned short int与signed char间未发生隐式类型转换?

C语言隐式类型转换差异问题解析

先看第一段代码及运行结果:

#include <stdio.h>

int main()
{
    short int a = -1; // ----> Line 1
    unsigned int b = 122; // ----> Line 2
    
    if (a > b)
        printf("a is big");
    else
        printf("a is small");

    return 0;
}

输出:a is big

这段代码里,short int类型的a在和unsigned int类型的b比较时,会触发寻常算术转换:因为unsigned int的类型秩(rank)比short int高,所以a会被隐式转换为unsigned int类型。-1转成unsigned int后是该类型的最大值(比如32位系统下是4294967295),自然比122大,所以输出a is big。

再看第二段代码及运行结果:

#include <stdio.h>

int main()
{
    char a = -1; // ---> Line 3
    unsigned short int b = 122; // ---> Line 4
    
    if (a > b)
        printf("a is big");
    else
        printf("a is small");

    return 0;
}

输出:a is small

你疑惑为什么这里没按预期把signed char转成unsigned short int?核心原因是**整数提升(Integer Promotion)**先于寻常算术转换执行:

  1. 对于变量a:char类型(这里是有符号的,因为赋值了-1)会先被提升为int类型——因为int的范围完全能覆盖char的所有取值(signed char范围是-128到127,int至少能覆盖-32768到32767),所以a提升后是int类型的-1。
  2. 对于变量b:unsigned short int类型同样会被提升为int类型——因为unsigned short的最大值(65535)也在int的取值范围内(32位int范围是-2147483648到2147483647),所以b提升后是int类型的122。

现在比较的是两个int类型的值:-1和122,显然-1 < 122,所以输出a is small。根本没走到char转unsigned short那一步,因为整数提升已经把两者都转成int了。

内容的提问来源于stack exchange,提问作者sai praveen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:42:36