短整数的基本运算

时间:2015-02-01 20:13:46

标签: c++11 integer

考虑一下代码

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的结果将相同。

1 个答案:

答案 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;本身没有触发溢出。