簡體   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