當你將一個無符號整型(unsigned integer
)轉換為一個有符號整型(signed integer
)時,具體的值取決于原始無符號整型的值以及目標有符號整型的大小。
轉換規則:
- 如果無符號整型的值在有符號整型的可表示范圍內(即它小于等于
INT_MAX
),則轉換后的值將保持不變。 - 如果無符號整型的值大于
INT_MAX
(對于int
類型),則會發生溢出。在這種情況下,轉換后的值將是無符號整型值對有符號整型最大值加一的模運算的結果。
溢出行為:
對于一個32位的int
,INT_MAX
通常是2147483647
(即2^31 - 1
)。如果一個unsigned int
的值超過了這個數,例如4294967295
(即UINT_MAX
),當它被轉換為int
時,實際上會發生模2^32
運算(因為unsigned int
通常也是32位),這意味著4294967295 % (2^32)
會得到4294967295
,但是當它被解釋為一個signed int
時,它會被理解為-1
,因為在二進制中11111111111111111111111111111111
代表的是-1
(在補碼表示法下)。
示例:
假設你有以下無符號整型變量:
1unsigned int uval = 4294967295U; // UINT_MAX for 32-bit systems
當uval
被轉換為int
時:
1int sval = uval; // Implicit conversion
在32位系統上,sval
的值將會是-1
,這是因為4294967295
超出了int
的正數范圍,但模2^32
運算后,其二進制表示與int
中