我不明白以下段落中的模运算:---
但是,当在对无符号整数的操作期间发生溢出时,结果是定义的:我们得到正确的答案模 2^n ,其中 n 是用于存储结果的位数。例如,如果我们将 1 添加到无符号数16 位数字 65,535 ,结果保证为 0。
我不明白以下段落中的模运算:---
但是,当在对无符号整数的操作期间发生溢出时,结果是定义的:我们得到正确的答案模 2^n ,其中 n 是用于存储结果的位数。例如,如果我们将 1 添加到无符号数16 位数字 65,535 ,结果保证为 0。
想象一个时钟,其值的范围为 [0..11](12 个不同的值),当您说时间是 14:00 时,您也可以说它是下午 2 点,即 14 mod 12。当整数溢出(65,536 mod 65,536 为 0)。答案在您的应用程序中在语义上是否正确取决于应用程序。
使用 n 位,您可以表示从 0 到 2^n-1 的数字范围。因此,如果您添加一个数字并且结果大于 2^n-1 它就不能表示为它。
想象你只能代表 5 个数字:
0 1 2 3 4
那么 2+3=5 不能表示,但是 5 mod 5 = 0 可以表示
0 1 2 3 4 0 1 2 3 4 5
这是因为 2^n-1 是二进制数:1111 1111 .... 1111(n 次),如果您向其中添加一个数字,则会出现溢出,并且重新开始计数:
1111 + 0001= 0000