为何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
相关产品推荐
相关产品推荐

