我有以下代码:
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”允许避免这种警告之王。
感谢您提供的任何帮助。
答案 0 :(得分:2)
需要对short
进行整体宣传,因此扩大是不可避免的,但如果您执行static_cast
,则会将结果转回short
简而言之:
short
= short
+ short
static_cast
的{{1}}将第二个值设为long
)short
= short
+ int
int
隐式转换为int
会产生警告来自[expr]:
许多期望算术或枚举类型操作数的二元运算符会导致转换和产生 结果类型以类似的方式。目的是产生一个通用类型,它也是结果的类型。 此模式称为通常的算术转换,其定义如下:
...否则,应对两个操作数执行整数提升(7.6)。然后是以下 规则应适用于提升的操作数
- 如果两个操作数具有相同的类型,则不需要进一步转换。
来自[conv.prom]
除
short
,bool
,char16_t
或char32_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
,然后进行分配。