簡體   English   中英

將負整數轉換為 C 中更大的無符號整數

[英]Casting a negative int to a bigger unsigned int in C

int main(){
 int a = -33553454;
 unsigned long b = a;
 return 0;
}

在上面的示例中, a是第一個符號擴展為 64 位值作為有signed integer(意味着 1 將放在其左側),然后將該值作為無符號整數分配給b

可以肯定地說,只有原始源操作數的類型很重要(如果它有符號或無符號)並且在這種情況下不考慮目標類型(因為目標是無符號的,你會認為a不會得到符號擴展,因為最終結果無論如何都是無符號的,並且 0 將填充b的左側。)

您正在將int值轉換為unsigned long值。 如何發生這種情況由C 標准的第 6.3.1.3 節規定:

1當一個 integer 類型的值轉換為另一個 integer 類型而不是_Bool時,如果該值可以用新的類型表示,則保持不變。

2否則,如果新類型是無符號的,則在新類型可以表示的最大值的基礎上反復加減一,直到值在新類型的范圍內。

3否則,新類型是有符號的,值不能在其中表示; 結果是實現定義的或引發了實現定義的信號

第 2 款適用於本案。 因為所討論的值是負數,因此超出了unsigned long的范圍,該類型的最大值 +1 被添加到原始值以獲得新值。

因此,假設unsigned long的最大值為 2 64 -1(或 18446744073709551615),則值 -33553454(0xFE0003D2)將轉換為 18446744073709551616 - 33553454 = 184467440736759980162(0xFFFFFFFF2) 您會注意到,如果您的機器使用二進制補碼表示(大多數都這樣做),那么這些數字的表示恰好是相同的(在符號擴展之后)。

暫無
暫無

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

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