为什么uint8_t + uint8_t导致int?

Vai*_*urt 4 c++ types

我注意到,对于8位变量的简单操作,变量int在操作完成之前转换为32位s,然后转换回8位变量.

举个例子,这个c ++程序:

#include <iostream>
#include <cstdint>

int main( void )
{
  uint8_t a = 1;
  uint8_t b = 2;

  std::cout << "sizeof(a)   = " << sizeof( a ) << std::endl;
  std::cout << "sizeof(b)   = " << sizeof( b ) << std::endl;
  std::cout << "sizeof(a+b) = " << sizeof( a+b ) << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

sizeof(a)   = 1
sizeof(b)   = 1
sizeof(a+b) = 4
Run Code Online (Sandbox Code Playgroud)

所以我们可以理解发生的事情是:

uint8_t c = (uint8_t)((int)(a) + (int)(b));
Run Code Online (Sandbox Code Playgroud)

显然,它似乎在论坛中所说的C的规范中.

另外,在Visual Studio 2013中,编写

auto c = a + b; 
Run Code Online (Sandbox Code Playgroud)

将鼠标指针悬停在上方c表示该类型为int.

问题是:

  • 为什么需要转换,为什么它在规范中?(如果可能的话,有了答案,我希望外部信息来源可以阅读更多有关该主题的内容(例如MSDN,cppreference).)
  • 这对性能有何影响?

Cor*_*mer 6

这是由于整体推广规则.特别

小整数类型(例如char)的Prvalues可以转换为较大整数类型(例如int)的prvalues .特别是,算术运算符不接受小于int的类型作为参数,并且在左值到右值转换后自动应用整数促销(如果适用).此转换始终保留该值.

  • @JesperJuhl*"..没有提升,中间结果会溢出"* - `int a = INT_MAX,b = 343232; 无论如何,int c = a + b`仍然会溢出......那么? (4认同)
  • *“为什么需要转换,为什么在规范中?”* (2认同)