首頁 >後端開發 >C++ >C 提升規則如何決定混合有符號和無符號整數類型的二元算術運算子的回傳類型?

C 提升規則如何決定混合有符號和無符號整數類型的二元算術運算子的回傳類型?

Patricia Arquette
Patricia Arquette原創
2024-11-28 08:30:11831瀏覽

How Do C   Promotion Rules Determine the Return Type of Binary Arithmetic Operators with Mixed Signed and Unsigned Integer Types?

提升規則如何管理具有混合符號類型的二元運算符算術

考慮以下代碼:

int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;

運算子計算結果為2147483648,建議使用unsigned int傳回型別。相反,在以下程式碼中:

unsigned int us = 42;
int neg = -43;
int result = us + neg;

result 為 -1,表示 int 回傳型別。

促銷規則解析

C標準定義了算術二元運算子(C §5/9):

  1. 如果任一操作數為long double,則將兩者都轉換為long double。
  2. 如果任一操作數為 double,則將兩者都轉換為 double。
  3. 如果任一操作數為浮點型,則將兩者都轉換為浮點型。
  4. 在兩者上套用積分提升
  5. 如果任一操作數為 unsigned long,則將兩者都轉換為 unsigned long。
  6. 如果任一運算元為 long int,另一個為 unsigned int,則盡可能將 unsigned int 轉換為 long int,否則將兩者都轉換為 unsigned long int。
  7. 如果任一操作數為 long,則將兩者都轉換為long。
  8. 如果其中一個運算元是無符號的,則將兩者都轉換為無符號。
  9. 如果兩個運算元都是 int,則不會再發生進一步的轉換。

的意義範例

在這兩個範例中,提升規則都會產生無符號型別

範例1: max 和1 都提升為unsigned int,導致回傳類型為unsigned int。

例 2: 提升法則並沒有規定 int 和 unsigned int 之間明顯的勝者。但是,選擇了無符號類型,導致結果無符號溢位。由於結果最終分配給 int,因此根據 C §4.7/3,結果值是未定義的。

以上是C 提升規則如何決定混合有符號和無符號整數類型的二元算術運算子的回傳類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn