int i=~0;
uint j=(uint)i;
j++;
printf("%u",j);
我有点困惑,因为增量j
是" 4294967295",但是在增加(j++
)之后而不是成为" 4294967296"它是0 ...任何人都可以解释一下吗?
答案 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