在C中未签名的签名转换

use*_*241 3 c c99

是否保证以下工作或实施定义?

unsigned int a = 4294967294;
signed int b = a;
Run Code Online (Sandbox Code Playgroud)

b-2在gcc上.

来自C99(§6.3.1.3/ 3)否则,新类型已签名且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号.

oua*_*uah 7

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

  • @ user963241在这种情况下,`a`的值可以用'b`的类型表示,因此转换后的值不变.没有实现定义的行为(根据6.3.1.3p1). (4认同)