處理有符號和無符號整數的運算符的提升規則
當處理涉及操作數之間不同符號的二元運算符時,中概述的提升規則C 標準開始發揮作用。這些規則決定了運算的結果類型以及操作數的轉換方式。
具體來說,「通常的算術轉換」適用於此處(第 5/9 節)。這些轉換依降序排列:
- 長雙精確度(如果存在)
- 雙精確度
- 浮點數
- 積分促銷(轉換短/整數) /long long 到int/long/long long)
- 無符號長整型(如果存在)
- 如果long int 可以表示所有unsigned int 值,則為Long,否則為unsigned long int
- Long(如果存在)
- Unsigned(如果存在)
將這些規則應用於兩種場景呈現:
場景1:
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
登入後複製
- max是signed int,1個是signed int,1個是signed unsigned int
- 發生積分提升,導致max as int
- 由於 unsigned int 排名較高,因此結果類型為unsigned int
- 結果: unsigned 溢到 2147483648
>場景2:
unsigned int us = 42;
int neg = -43;
int result = us + neg;
登入後複製
- us 是unsigned int, neg已簽署int
- 發生整數提升,導致我們為unsigned int,neg為int
- 由於unsigned int排名較高,所以結果型別為unsigned int
- 但是值我們的負數 (-1) 無法用 int
- 表示結果:實現定義的行為,可能回傳-1 或取決於平台
以上是C 提升規則如何處理有符號和無符號整數的二元運算?的詳細內容。更多資訊請關注PHP中文網其他相關文章!