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

Integer overflow(int与char):为何第一个示例有输出,第二个却无?

为什么这两个整数比较示例会有不同的输出?

先把问题里的两个示例明确出来:

示例1(有输出)

unsigned long l = ULONG_MAX; 
char c = -1; 
if (c == l) std::cout << "-1 = 4,294,967,295?";

输出:-1 = 4,294,967,295?

示例2(无输出)

unsigned char l = 255; 
char c = -1; 
if (c == l) std::cout << "-1 = 4,294,967,295?";

输出:无


核心原因:C++的寻常算术转换规则

要搞懂这两个例子的差异,得先明白C++在比较不同类型整数时的底层逻辑:当两个整数类型的操作数进行比较(或算术运算)时,编译器会按照一套固定规则把它们转换成共同的类型,这个过程就是「寻常算术转换」,其中整数提升是第一步。

示例1的执行过程

假设你的平台上char是有符号类型(这是绝大多数编译器的默认设置),char c = -1的二进制是全1(比如8位的0b11111111):

  1. 比较c == l时,首先对c做整数提升:因为-1可以被int完整表示(int的范围远大于char),所以c被转换成int类型,值还是-1。
  2. 接下来要把int和unsigned long转换成共同类型:根据规则,当有符号类型和无符号类型混合时,有符号类型会被强制转换成对应的无符号类型。int(-1)转成unsigned long时,会遵循无符号整数的「模2^N」转换规则(N是unsigned long的位数),最终结果就是ULONG_MAX——和l的值完全一致。
  3. 最后比较两个unsigned long类型的ULONG_MAX,结果相等,所以条件成立,输出内容。

示例2的执行过程

同样基于char是有符号类型的前提:

  1. 比较c == l时,先对两个操作数做整数提升:
    • char c = -1被提升为int(-1);
    • unsigned char l = 255:因为255可以被int完整表示(int至少是16位,最大值远大于255),所以l被提升为int(255)。
  2. 现在两个操作数都是int类型,直接比较-1和255——显然不相等,所以条件不成立,没有输出。

补充:如果char是无符号类型?

如果你的平台默认char是无符号的,那char c = -1会被转换成255(无符号char的范围是0-255,-1模256就是255)。这时候示例2里c和l都会被提升为int(255),比较会相等,就会有输出。但这种情况比较少见,大部分主流平台都是有符号char。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:32:15