4

我开始用 C 语言编程,但在理解我得到的一些结果时遇到了问题。我将代码粘贴在这里:

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

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

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

4

7 回答 7

3

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

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

x-1

对比

x = x - 1;

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

于 2012-08-10T13:49:45.517 回答
1

它是固定位数 (32) 和二进制补码,让您来到这里。

于 2012-08-10T13:50:04.040 回答
1

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

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

于 2012-08-10T13:52:05.370 回答
1

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

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

 unsigned int x = -1;    /* Assigns UINT_MAX. */ 
于 2012-08-10T14:02:59.370 回答
0

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

于 2012-08-10T13:49:35.563 回答
0

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

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

最高位与其他位一起被设置,然后被解释为正数,这是怎么回事。

于 2012-08-10T13:50:52.703 回答
0

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

于 2012-08-10T13:51:15.030 回答