[英]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
long
的static_cast
使第二个值成为short
) short
= int
+ int
int
隐式转换为short
会产生警告 来自[expr]:
许多期望算术或枚举类型的操作数的二进制运算符都以类似的方式引起转换并产生结果类型。 目的是产生一个通用类型,它也是结果的类型。 这种模式称为通常的算术转换 ,其定义如下:
...
否则,应在两个操作数上执行积分提升(7.6)。 然后,以下规则将应用于提升后的操作数
-如果两个操作数具有相同的类型,则无需进一步转换。
来自[conv.prom]
如果
int
可以表示源类型的所有值,则整数转换等级(7.15)小于int等级的bool
,bool
,char16_t
,char32_t
或wchar_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.