如何理解递增的无符号值概念?

时间:2015-01-10 07:47:35

标签: c

int i=~0;

uint j=(uint)i;

j++;

printf("%u",j);

我有点困惑,因为增量j是" 4294967295",但是在增加(j++)之后而不是成为" 4294967296"它是0 ...任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

32位unsigned int的范围是

0 to 4,294,967,295

因此,增加超过此值(例如+1到此值)将导致回滚/回绕到0。

编辑:

  

§6.2.5类型¶9涉及无符号操作数的计算永远不会   溢出,因为结果无法由结果表示   无符号整数类型以一个更大的数量减少   而不是结果类型可以表示的最大值

答案 1 :(得分:1)

这是因为它溢出,这意味着数据类型超过了它可以表示的最大值。

int i = ~0

所有位都设置为1。对于int,这被解释为-1。

uint j=(uint)i;

您复制数据并将其转换为unsigned int。 -1不能用unsigned int表示,并且类似于下面的环绕,所以它的所有位都设置为1.

j++;

当你加一个它溢出。如果你看一下加法,很容易理解为什么。该数字仅由一定数量的位表示,在您的机器上,int为32位。对于4位数字,它看起来像这样:

1111 + 1 = 10000

但是无法存储最高位的位,对于无符号整数,这被定义为包围如下:

1111 + 1 =  0000