繁体   English   中英

从长错误转换为短错误

[英]Conversion from long to short error

我有以下代码:

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”可以避免这种警告之王。

感谢您提供的任何帮助。

需要对short整体提升,因此不可避免地要扩大,但是如果执行static_cast ,则会将结果static_cast转换为short

简而言之:

  • 您正在做short = short + short
    • longstatic_cast使第二个值成为short
  • 在检查操作数的类型之前进行积分提升
    • 所以你会得到short = int + int
  • 将结果int隐式转换为short会产生警告

来自[expr]:

许多期望算术或枚举类型的操作数的二进制运算符都以类似的方式引起转换并产生结果类型。 目的是产生一个通用类型,它也是结果的类型。 这种模式称为通常的算术转换 ,其定义如下:
...
否则,应在两个操作数上执行积分提升(7.6)。 然后,以下规则将应用于提升后的操作数
-如果两个操作数具有相同的类型,则无需进一步转换。

来自[conv.prom]

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

实际上short的等级比int低:

来自[conv.rank]

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

有关执行强制转换(使警告消失)的信息,请参阅Richard Crittenden对OP的评论或Nathan Oliver的回答

即使您将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 ,然后进行赋值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM