C中无符号的有符号转换

问题描述 投票:3回答:2

是否保证以下各项能够正常工作或实施?

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

[g0的b值为-2

从C99(第6.3.1.3/3节),否则,将对新类型进行签名,并且值不能为代表其中;结果要么是实现定义的,要么是实现定义的信号被引发。

c c99
2个回答
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


0
投票

添加到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)作为最终答案。

希望这有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.