[英]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.