[英]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.