繁体   English   中英

C中无符号到有符号的转换

[英]Unsigned to signed conversion in C

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

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

b的值在 gcc 上是-2

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

值到signed int的转换a实现定义的(正如您正确提到的那样,因为 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

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

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

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

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

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

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

希望这有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM