当你将一个无符号整型(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
中