是否保证以下各项能够正常工作或实施?
unsigned int a = 4294967294;
signed int b = a;
[g0的b
值为-2
。
从C99(第6.3.1.3/3节),否则,将对新类型进行签名,并且值不能为代表其中;结果要么是实现定义的,要么是实现定义的信号被引发。
a
值到signed int
的转换是实现定义的(如6.3.1.3p3所述,您已正确提及)。例如,在某些系统上,它可以是INT_MAX
(饱和转换)。
对于gcc
,在此处定义实现行为:
当整数无法在该类型的对象中表示时,将整数转换为带符号整数类型的结果或发出的信号(C90 6.2.1.2,C99 6.3.1.3)。
对于转换为宽度为N的类型,该值将以模2 ^ N的模减少到该类型的范围内;没有信号发出。
http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html
添加到ouah的答案中,专门针对您的实现:
1)您的实现似乎具有32位宽的int类型和2的补码表示形式。
2)4294967294是(UINT_MAX-1)= 0xfffffffe。
在您的实现中,(UINT_MAX-1)转换为带符号的int,如下所示:0xfffffffe转换为〜(0xfffffffe)+ 1 =(二进制1)+ 1 = 10二进制=十进制2。
注意,在此转换之前,最高有效位是1(以0xfffffffe表示),因此在上述转换之后,最终数字将解释为负数。因此,您在转换后得到(-2)作为最终答案。
希望这有所帮助。