c++ “(0 u- 1)”模2^N的结果是什么?

oxosxuxt  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(130)

p2只是说
无符号类型的算术是以2N为模执行的
考虑以下示例

auto t = 0u -1;

根据通常的算术转换,两个操作数都是无符号整型。算术结果应该对2N取模,在任何计算器中,-1 mod 4294967296总是得到-1(假设N等于32)。我看不出取模可以使结果落入范围[0,4294967296]。有什么问题吗?

cbjzeqam

cbjzeqam1#

模运算本身是不明确的。它的定义如下:
在几乎所有的计算系统中,a除以n的商q和余数r满足以下条件:
q ∈
a = nq + r
|剩余|〈|n个|
(from(第10页)
在C++中,余数的符号跟在被除数的符号后面,所以你说的是对的。
然而,实际的计算机计算并不是这样工作的; 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++无符号整数实际上并不是通过模来计算的。尽管如此,它看起来还是和我们“执行模”的一样。

相关问题