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

为何signed/unsigned int与char的==比较、%d输出表现不同?

C语言代码运行结果差异原因分析

代码示例一:有符号与无符号类型的==比较差异

代码

#include <stdio.h>
#include <limits.h> // 需包含此头文件使用UINT_MAX、UCHAR_MAX

signed a = -1;
unsigned b = UINT_MAX;
printf("%d\n", a == b);

signed char c = -1;
unsigned char d = UCHAR_MAX;
printf("%d\n", c == d);

运行结果

1
0

差异原因

这是C语言寻常算术转换和整数提升规则共同作用的结果:

  • int与unsigned int的比较:当signed int和unsigned int做比较时,规则要求signed int转换为unsigned int。-1作为有符号整数,转成无符号整数时,补码位模式会被直接解释为UINT_MAX,因此a == b结果为1(真)。
  • signed char与unsigned char的比较:char类型参与运算时会先触发整数提升。在多数系统中,char长度(8位)小于int(32位):
    • signed char c = -1会被提升为int类型的-1;
    • unsigned char d = UCHAR_MAX(即255)会被提升为int类型的255。
      此时比较的是两个int值-1和255,显然不相等,所以结果为0(假)。你提到的“基于实际值”其实是整数提升后的结果,并非直接比较char原始值。

代码示例二:printf的%d格式化输出差异

代码

#include <stdio.h>
#include <limits.h>

signed char a = -1;
unsigned char b = 255;
printf("%d\n", a);
printf("%d\n", b);

signed c = -1;
unsigned d = UINT_MAX;
printf("%d\n", c);
printf("%d\n", d);

运行结果

-1
255
-1
-1

差异原因

核心在于printf可变参数规则和%d的语义:

  • char类型的输出:printf的可变参数列表中,char、short这类短整型会自动提升为int:
    • signed char a = -1提升为int的-1,%d(输出有符号int)自然显示-1;
    • unsigned char b = 255提升为int的255(255在int取值范围内),所以%d输出255。
  • unsigned int的%d输出:%d的作用是输出有符号int类型的十进制值,但d是unsigned int类型,属于类型不匹配,严格来说是未定义行为。在主流补码系统中,UINT_MAX的位模式和有符号int的-1完全相同,printf用%d解析时会把这个位模式当作有符号int解读,因此显示为-1。这不是“不基于实际值”,而是类型不匹配导致的错误解析——d实际是极大的无符号正数,但%d错误将其识别为有符号整数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:34:58