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很花哨)?答案 0 :(得分:5)
简短回答:(现在很长一段时间因为人们想要对英语过于迂腐,这本质上并不准确)。
它没有明确(如在一元减去mathematical
中)。
但是作为POD数据上任何操作(包括一元减去operation
)的一部分,对输入参数进行隐式检查(可以使用的最小整数类型和操作是int
)所以有在一元减去(mathematical
部分而不是操作部分)之前对输入进行积分提升。 POD上所有操作的输出与输入参数相同(应用积分提升后)。因此,这里的输出也是int
。
答案很长:
在C(以及C ++)中,POD操作发生的最小类型是int
。因此,在应用一元减号之前,该值将转换为int。然后应用一元减号。因此表达式的结果是int
。
答案 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
是有意义的。无论如何,可能没有性能成本。