考虑一下代码
int16_t x = 1;
int16_t y = 1;
auto v = x + y;
int16_t w = x + y;
cout << sizeof(v) << endl << sizeof(w) << endl;
我使用#include <cstdint>
作为固定大小的整数。
输出是
4
2
为什么v和w的大小不同,如何在原语操作中修复整数的大小?
请注意,如果我使用8位整数类型而不是int16_t,则v的结果将相同。
答案 0 :(得分:1)
正如http://en.cppreference.com/w/cpp/language/implicit_cast所述:
小整数类型(例如
char
)的Prvalues可能会转换为更大整数类型的prvalues(例如int
)。特别是,算术运算符不接受小于{{}的类型{1}}作为参数,并且在左值到右值转换后自动应用积分促销(如果适用)。此转换始终保留该值。
[强调我的;链接删除]
所以没有办法做你想做的事。
int
的工作原因是它最后会转换回int16_t w = x + y;
。来自同一个来源:
如果目标类型已签名,则如果源整数可以在目标类型中表示,则值不会更改。否则结果是实现定义的。 (注意,这与有符号整数算术溢出不同,这是未定义的)
[已删除链接]
编辑添加:这就是说,我应该提一下,没有真正的理由去做你想做的事情。确实int16_t
表示int16_t w = x + y;
而不是开始执行16位加法;但结果是相同的。唯一的区别是,如果int16_t w = static_cast<int16_t>( static_cast<int>(x) + static_cast<int>(y) );
超出16位整数的范围,那么x + y
仍然会相当良好(给出实现定义的结果),因为int16_t w = x + y;
本身没有触发溢出。