在C中签名转换为未签名
是否保证以下工作或实施定义?
unsigned int a = 4294967294; signed int b = a;
gcc的b
值为-2
。
从C99(§6.3.1.3/ 3)起,否则新签名类型无法在其中表示; 结果是实现定义的,或者引发实现定义的信号。
将值转换为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