4

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

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

的值b-2gcc 上。

从 C99 (§6.3.1.3/3) 开始,否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。

4

2 回答 2

8

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

于 2012-11-29T23:09:05.100 回答
-1

@ouah 的答案告诉您它的实现定义,但没有解释您的实现如何具体产生 (-2)。我会这样回答:

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

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

在您的实现中, (UINT_MAX - 1) 被转换为有符号整数,如下所示:

0xffffffffe 被转换为 ~(0xffffffffe) + 1 = (二进制中的 1) + 二进制中的 1 = 10 = 十进制中的 2。

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

希望这有帮助。

于 2020-03-27T02:20:58.320 回答