【问题标题】:Unsigned to signed conversion in CC中的无符号到有符号转换
【发布时间】:2012-11-18 03:40:33
【问题描述】:

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

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

b 在 gcc 上的值是-2

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

【问题讨论】:

    标签: c c99


    【解决方案1】:

    a 值到 signed int 的转换是实现定义的(正如您正确提到的,因为 6.3.1.3p3)。例如,在某些系统上,它可以是 INT_MAX(饱和转换)。

    对于gcc,这里定义了实现行为:

    当值无法在该类型的对象中表示时,将整数转换为有符号整数类型的结果或引发的信号(C90 6.2.1.2,C99 6.3.1.3)。 em>

    为了转换为宽度为 N 的类型,该值以 2^N 为模减少到该类型的范围内;没有发出信号。

    http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html

    【讨论】:

    • 如果我使用一个较小的值给出一个正整数,例如:unsigned int a = 42; signed int b = a; 结果仍然是实现定义的吗?
    • @user963241 在这种情况下a 的值可以用b 的类型表示,因此转换后的值不变。没有实现定义的行为(根据 6.3.1.3p1)。
    【解决方案2】:

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

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

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

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

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 2013-07-23
      • 1970-01-01
      • 2013-12-19
      • 2013-04-06
      • 2021-12-31
      相关资源
      最近更新 更多