【问题标题】:Can't understand unsigned int type in C无法理解 C 中的 unsigned int 类型
【发布时间】:2012-08-07 20:04:11
【问题描述】:

我开始使用 C 进行编程,但在理解我得到的一些结果时遇到了问题。我把代码贴在这里:

#include <stdio.h>
unsigned int main(void)
{
    unsigned int x = 0;

    printf("%u\n",x-1);
    return 0;
}

终端返回 4.294.967.295,我不明白为什么。我知道这个值是unsigned int 的最大值,但实际上我期待编译器发出一些警告,说我必须使用int 类型而不是unsigned int,因为结果是否定的。无论如何,有人可以帮助我吗?

【问题讨论】:

标签: c types int unsigned-integer


【解决方案1】:

无符号表示您只有正值。计算机使用一些规则将数字存储为二进制。当您执行 0 - 1 时,您将获得最大的 int 值。您可以在这里阅读更多相关信息:http://en.wikipedia.org/wiki/Signed_number_representations

【讨论】:

  • Bzzt: 0 是无符号的,但不是正数:-)
  • 我的意思是非负数;)。但也有 +0 和 -0。 :)
【解决方案2】:

当您使用无符号类型时,所有位都用于表示非负值(即 >= 0)。将此视为环绕的值,因此当您递减到低于下限 (0) 时,您会环绕到最大值(32 位,2^32 - 1)。

另外,请注意您没有为变量x 分配负值,您只是提供了一个从中减去 1 的表达式。即,

x-1

x = x - 1;

虽然您是否会收到关于此的警告可能取决于编译器和设置的警告级别。

【讨论】:

    【解决方案3】:

    是固定位数 (32) 和 two's complement 将您带到这里。

    【讨论】:

    • 二进制补码用于有符号数。这些是没有符号位的无符号二进制表示。
    • 可以,但是机器不在乎。
    • @nikolai;无符号被定义为算术模 2^N。机器在某些情况下可能关心。但是模算术没有上溢/下溢的概念。模 4, 3 + 1 为 0,没有溢出。而对于整数,数字加 1 会导致溢出。
    【解决方案4】:

    因为unsigned int不能存储负整数。

    请阅读有关补数和二复数的信息。

    最高位与其他位一起被设置,然后被解释为正数。

    【讨论】:

      【解决方案5】:

      您不会收到错误,因为编译器无法知道您将来会做什么。

      【讨论】:

        【解决方案6】:

        unsigned int 顾名思义没有任何迹象。

        unsigned int 值表示为 32 位值,因此当您减去 1 时,它会从 0x00000000 翻转到 0xFFFFFFFF,从而得到 4294967295。

        【讨论】:

          【解决方案7】:

          C 标准规定所有无符号算术都发生在模 2^N 范围内,其中 N 是类型中的位数。因此,在无符号算术中从 0 中减去 1 不会导致 -1,而是会导致 UINT_MAX。

          将无符号值视为一个环,其中 0 粘在 UINT_whatever 旁边。无论你是加、减、移位、乘,甚至是求反,你都不会离开戒指。所以你完全可以做类似的事情

           unsigned int x = -1;    /* Assigns UINT_MAX. */ 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-24
            • 2014-04-05
            • 2021-06-07
            • 1970-01-01
            • 2017-09-10
            • 2011-12-12
            相关资源
            最近更新 更多