p2只是说无符号类型的算术是以2N为模执行的考虑以下示例
auto t = 0u -1;
根据通常的算术转换,两个操作数都是无符号整型。算术结果应该对2N取模,在任何计算器中,-1 mod 4294967296总是得到-1(假设N等于32)。我看不出取模可以使结果落入范围[0,4294967296]。有什么问题吗?
-1 mod 4294967296
-1
N
cbjzeqam1#
模运算本身是不明确的。它的定义如下:在几乎所有的计算系统中,a除以n的商q和余数r满足以下条件:q ∈a = nq + r|剩余|〈|n个|(from(第10页)在C++中,余数的符号跟在被除数的符号后面,所以你说的是对的。然而,实际的计算机计算并不是这样工作的; 0u - 1的运算方式如下,不使用模运算:
0u - 1
0000 0000 0000 0000 0000 0000 0000 0000 - 0000 0000 0000 0000 0000 0000 0000 0001 ----------------------------------------- 1111 1111 1111 1111 1111 1111 1111 1111
这导致t是2^32 - 1,与模2^32的正数相同。总之,C++无符号整数实际上并不是通过模来计算的。尽管如此,它看起来还是和我们“执行模”的一样。
t
1条答案
按热度按时间cbjzeqam1#
模运算本身是不明确的。它的定义如下:
在几乎所有的计算系统中,a除以n的商q和余数r满足以下条件:
q ∈
a = nq + r
|剩余|〈|n个|
(from(第10页)
在C++中,余数的符号跟在被除数的符号后面,所以你说的是对的。
然而,实际的计算机计算并不是这样工作的;
0u - 1
的运算方式如下,不使用模运算:这导致
t
是2^32 - 1,与模2^32的正数相同。总之,C++无符号整数实际上并不是通过模来计算的。尽管如此,它看起来还是和我们“执行模”的一样。