从长错误转换为短错误

时间:2017-09-18 16:00:59

标签: c++ type-conversion

我有以下代码:

int main()
{
   short s(0);
   long l(10);

   s += static_cast<short>(l);
}

我正在用g ++编译它,我收到以下错误:

..\src\main.cpp:6:7: warning: conversion to 'short int' from 'int' may alter its value [-Wconversion]

我绝对不知道为什么会这样,因为我认为“static_cast”允许避免这种警告之王。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:2)

需要对short进行整体宣传,因此扩大是不可避免的,但如果您执行static_cast,则会将结果转回short

简而言之:

  • 您正在执行short = short + short
    • static_cast的{​​{1}}将第二个值设为long
  • 在检查操作数的类型之前发生整数提升
    • 因此您将获得short = short + int
  • 将生成的int隐式转换为int会产生警告

来自[expr]:

  

许多期望算术或枚举类型操作数的二元运算符会导致转换和产生   结果类型以类似的方式。目的是产生一个通用类型,它也是结果的类型。   此模式称为通常的算术转换,其定义如下:
...否则,应对两个操作数执行整数提升(7.6)。然后是以下   规则应适用于提升的操作数
- 如果两个操作数具有相同的类型,则不需要进一步转换。

来自[conv.prom]

  

shortboolchar16_tchar32_t整数转换以外的整数类型的prvalue   如果wchar_t可以表示所有的int,则rank(7.15)小于int的等级可以转换为int类型的prvalue   源类型的值;否则,源prvalue可以转换为unsigned int类型的prvalue。

确实short的排名低于int

来自[conv.rank]

  

有符号整数类型的等级应大于带有a的任何有符号整数类型的等级   尺寸较小。

为了执行演员表(使警告消失),请参阅Richard Crittenden对OP的评论或Nathan Oliver's answer

答案 1 :(得分:2)

即使您将l投射到short,您仍然会遇到另一种转换方式。当你这样做

 s += static_cast<short>(l);

[expr.ass] / 7表示它与

相同
s = s + static_cast<short>(l)

这种转变正是在你收到的警告中给你int的。

原因是对于小于int的类型,内置运算符不存在。由于这两种类型都是short,因此它们会转换为int,为您提供结果的int,现在您尝试将int分配给short哪个可能会溢出要解决此问题,您可以使用

s = static_cast<short>(s + l);

将结果转换为short,然后进行分配。