为什么一元减去执行整体推广?

时间:2012-08-02 20:09:47

标签: c++ auto integer-promotion

const auto min = -std::numeric_limits<T>::max();
T x = min; // conversion from 'const int' to 'short', possible loss of data

T是模板参数,在这种情况下为short。一元减号显然表现出整体推广。

  • 为什么一元减去执行整体推广?
  • 如果auto更改为T,则不会生成警告,但应将int分配给short。为什么没有警告(可能VS很花哨)?

4 个答案:

答案 0 :(得分:5)

简短回答:(现在很长一段时间因为人们想要对英语过于迂腐,这本质上并不准确)。

它没有明确(如在一元减去mathematical中)。 但是作为POD数据上任何操作(包括一元减去operation)的一部分,对输入参数进行隐式检查(可以使用的最小整数类型和操作是int)所以有在一元减去(mathematical部分而不是操作部分)之前对输入进行积分提升。 POD上所有操作的输出与输入参数相同(应用积分提升后)。因此,这里的输出也是int

答案很长:

在C(以及C ++)中,POD操作发生的最小类型是int。因此,在应用一元减号之前,该值将转换为int。然后应用一元减号。因此表达式的结果是int

见这里:Implicit type conversion rules in C++ operators

答案 1 :(得分:3)

一元减号执行整数提升,因为整数类型上的所有算术运算符都可以执行。这个约定可能是出于性能原因而建立的(通常int是最适合硬件上整体操作的大小),也许是因为它有时不限于较小整数类型的范围。

我见过人们犯的错误:

uint64_t i = 1 << 33; // use 64-bit type to ensure enough bits to hold the result

但这是一个错误,因为1 << 33的结果不依赖于它的分配。 (今天我们有关于此的警告)。丑陋的解决方案是手动强制其中一个操作数足够大:uint64_t i = static_cast<uint64_t>(1) << 33

积分促销恰好可以避免使用较小类型的同类错误,这在以这种方式设计C时可能是常见的情况:

short a = 30000, b = 20000
int i = a + b;

无论如何“它不一定是合乎逻辑的。这是法律。”

答案 2 :(得分:0)

我认为这是考虑C / C ++假设的理想计算机模型。计算在寄存器中执行,它意味着结果的大小将是机器字。因此“自动化”扩张

答案 3 :(得分:0)

我相信它(部分)是因为short的否定可能无法表示为short
如果int为16位且short更大,则(-2 15 可能需要升级至int。)

当然,不能保证int更大,但它(通常是?)无论如何都是机器的最佳数据类型,因此尝试将其推广到int是有意义的。无论如何,可能没有性能成本。