簡體   English   中英

“通常的算術轉換”和“整數提升”是一樣的嗎?

[英]Are the “usual arithmetic conversions” and the “integer promotions” the same thing?

“通常的算術轉換”和“整數提升”是一樣的嗎? 我已經讀到“常規算術轉換”用於使表達式的操作數成為同一類型,而“整數提升”用於將小於int的類型提升為int ,但是在MSDN中 ,這兩個概念都放在僅“常規算術轉換”。

沒有。

通常的算術轉換在某些情況下涉及整數提升,但這是兩個獨立的機制:

[C++14: 5/10]:許多期望算術或枚舉類型的操作數的二進制運算符都以類似的方式導致轉換並產生結果類型。 目的是產生一個通用類型,它也是結果的類型。 這種模式稱為通常的算術轉換 ,其定義如下:

  • 如果兩個操作數都屬於范圍枚舉類型(7.2),則不執行任何轉換。 如果另一個操作數不具有相同的類型,則表達式格式錯誤。
  • 如果一個操作數的類型為long double ,則另一個應轉換為long double
  • 否則,如果其中一個操作數為double ,則另一個應轉換為double
  • 否則,如果其中一個操作數為float ,則另一個應轉換為float
  • 否則,應在兩個操作數上執行積分提升(4.5) 61然后,以下規則應應用於提升后的操作數:
    • 如果兩個操作數具有相同的類型,則無需進一步轉換。
    • 否則,如果兩個操作數都具有符號整數類型或都具有無符號整數類型,則整數轉換等級較小的操作數應轉換為等級較大的操作數的類型。
    • 否則,如果具有無符號整數類型的操作數的秩大於或等於另一個操作數的類型的秩,則帶符號整數類型的操作數應轉換為無符號整數類型的操作數的類型。
    • 否則,如果帶符號整數類型的操作數的類型可以表示無符號整數類型的操作數的所有值,則應將無符號整數類型的操作數轉換為帶符號整數類型的操作數的類型。
    • 否則,兩個操作數均應轉換為與帶符號整數類型的操作數類型相對應的無符號整數類型。

C11中的措辭大體相同。

注意,積分提升也可以在與通常的算術轉換無關的情況下執行,例如,LHS操作數的移位; 最終,所有這就是為什么這兩種機制有各自不同的名稱的原因!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM