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

为何GCC会在一元负号运算符下将int16_t扩展为int32_t?

为什么-i或zero-i的结果类型是4字节int而非int16_t?

以下代码中,变量i是int16_t类型(占2字节),但表达式-i的结果却占4字节,即便改成zero-i(其中zero是static constexpr int16_t zero = 0),结果依然是4字节的int类型,这背后的逻辑是什么?

示例代码:

#include <iostream>

int
main()
{
    int16_t i = 4;

    std::cout << "sizeof(i): " << sizeof(i) << std::endl;
    std::cout << "sizeof(-i): " << sizeof(-i) << std::endl;

    return 0;
}

预期输出:

sizeof(i): 2
sizeof(-i): 2

实际输出:

sizeof(i): 2
sizeof(-i): 4

这是C++**整数提升(integral promotion)**规则导致的结果:

  • C++标准规定,当尺寸小于int的整数类型(比如int16_t,通常对应short)参与表达式运算时,会被自动提升为int类型——只要int能够容纳原类型的所有取值范围(在32位系统中,int是4字节,完全能覆盖int16_t的-32768到32767范围)。
  • 对于-i:i先被提升为int类型,再执行取负操作,最终结果的类型是int,所以sizeof(-i)返回4。
  • 对于zero-i:zero和i都会被提升为int,减法运算的两个操作数都是int,结果自然也是int,因此尺寸还是4字节。

如果需要让结果保持int16_t类型,需要显式进行类型转换,比如:

std::cout << "sizeof(static_cast<int16_t>(-i)): " << sizeof(static_cast<int16_t>(-i)) << std::endl;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:31:24