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

unsigned short运算未实现环绕功能?还是被提升为int导致结果异常?

问题解析:unsigned short与signed short运算结果不符合预期的原因

核心原因是整数提升(Integer Promotion),而非unsigned short被禁止实现环绕功能。

具体运算过程分析

在C++的算术运算规则中,所有小于int尺寸的整数类型(包括short、unsigned short、char等),都会先被提升为int类型(前提是int能容纳原类型的所有取值,这在主流32位/64位系统中都是成立的,因为int通常为32位,完全覆盖16位short的取值范围)。

对应到你的代码:

  • unsigned short ussh{1}被提升为int类型的1
  • signed short ssh{-3}被提升为int类型的-3
  • 两者相加得到1 + (-3) = -2,这个结果是int类型,因此cout直接输出-2。

为什么unsigned long/unsigned int运算正常

因为unsigned int和unsigned long的尺寸大于或等于int(32位系统中unsigned int与int同为32位,unsigned long为32位或64位),运算时不会被提升为int,而是保持原unsigned类型。此时遵循unsigned类型的运算规则:当signed类型与unsigned类型运算时,signed类型会被转换为对应的unsigned类型,运算结果也是unsigned类型,因此会触发环绕行为。

如何得到预期的环绕结果

如果希望得到unsigned short的环绕运算结果,需要手动将加法结果转换回unsigned short:

std::cout << static_cast<unsigned short>(ussh + ssh) << '\n';

此时int类型的-2会被转换为unsigned short类型的65534(因为unsigned short的取值范围是0~65535,-2加上65536后得到65534),最终输出符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:45:02