在C中未签名的签名转换

时间:2012-11-29 23:04:02

标签: c c99

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

unsigned int a = 4294967294;
signed int b = a;

b的值在gcc上为-2

  

来自C99   (§6.3.1.3/ 3)否则,新类型已签名且值不可   代表其中;结果是实现定义的还是   实现定义的信号被提出。

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

@ouah的答案告诉您其实现是定义的,但没有说明您的实现是如何具体产生(-2)的。我会回答:

1)您的实现似乎具有32位宽的int类型和2的补码表示形式。

2)4294967294是(UINT_MAX-1)= 0xfffffffe。

在您的实现中,(UINT_MAX-1)转换为带符号的int,如下所示:

0xfffffffe转换为〜(0xfffffffe)+1 =(1二进制)+ 1 = 10二进制= 2十进制。

请注意,在此转换之前,最高有效位是1(以0xfffffffe表示),因此在上述转换之后,最终数字将被解释为负数。因此,您在转换后得到(-2)作为最终答案。

希望这会有所帮助。

相关问题