[conv.integral]/3 在最新的C++草案中

[conv.integral]/3 in the the latest C++ draft

本文关键字:最新 C++ 草案 conv integral      更新时间:2023-10-16

我了解将short转换为unsigned int的机制。例如,给定一个short y = -1;并将其分配给一个unsigned int我们将得到数字 4,294,967,295,它等于 2^32 -1。如果short等于 -2 并且我们将其分配给一个unsigned int,我们将得到 4,294,967,294,等于 2^32 - 2,依此类推。

我的问题是从最新草案的[conv.integral]/3段中推断出上面解释的机制:

否则,结果是目标类型的唯一值 与源整数模 2^N 全等,其中 N 是宽度 目标类型。

我可以理解 4,294,967,295 mod 2^32 = 4,294,967,295 是目标类型的唯一值,可能与源类型的值 -1 mod 2^32 全等(短(。但是我如何证明这两个数字相等呢?

但是

我如何证明 [4,294,967,295 和 -1] 相等呢?

这些数字并不相等。它们是等模 232(等于 4'294'967'296(。

要知道如何显示一致性,让我们首先看一下定义(维基百科(:

对于正整数 n,两个数字 a 和 b 被称为全等模 n,如果它们的差 a − b 是 n 的整数倍(也就是说,如果有一个整数 k使得 a − b = kn(

好的,让我们计算一下这个差异:

d = a − b
d = 4'294'967'295 - (-1)
d = 4'294'967'296

现在,让我们回答这个问题,dn的倍数吗?换句话说,是否存在一个乘数k可以乘以d,以便结果n.

答:是的,有。对于k = 1d * 1等于 4'294'967'296,这确实等于n。因此,我们已经证明-1 ≡ 4'294'967'295 (mod 4'294'967'296(。