[英]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.