0x3f3f3f3f - 神奇的“超级大的数”

有时候做 BFS 和 DFS 之类的题,看题解的时候,经常能看到:

1
const int inf=0x3f3f3f3f;

一般去找最小值的题目的时候,我会定义一个很大很大的数,这样方便之后是逐步更新。但这个很大很大的数,究竟该多少呢?

我们并不知道输入的数据会有多大,所以我们也不好去定义这样一个大的数。0x3f3f3f3f 就解决了这样一个问题。

0x3f3f3f3f 的十进制表示是 10611095671061109567,这个数的大小是 10910^9 级别的,而一般的整型数据不会高于 10910^9。因此,我们可以认为这个数是一个非常大的数

为什么用这个数?

我的观点是,说简单点就是两个字:省事。这个数非常好记,拿来就用。

直到我看到这样一篇文章:

由于一般的数据都不会大于 10910^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上 0x3f3f3f3f + 0x3f3f3f3f = 2122219134,这非常大但却没有超过 32-bit int 的表示范围,所以 0x3f3f3f3f满足了我们“无穷大加无穷大还是无穷大”的需求

最后,0x3f3f3f3f 还能给我们带来一个意想不到的额外好处:
如果我们想要将某个数组清零,我们通常会使用 memset(a,0,sizeof(a)),方便又高效,但是当我们想将某个数组全部赋值为无穷大时,就不能使用 memset 函数而得自己写循环了,因为 memset 是按字节操作的,它能够对数组清零是因为 0 的每个字节都是 0(一般我们只有赋值为 -10 的时候才使用它)。现在好了,如果我们将无穷大设为 0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f 的每个字节都是 0x3f!所以要把一段内存全部置为无穷大,我们只需要 memset(a,0x3f,sizeof(a))

我又去查了查,发现也有人把 inf 设置为 0x7fffffff,这个数是 32 位整型的最大值,虽说这个数更大,但是已经到达了边界,无论是算法需要继续增加,还是设计程序时 bug 导致继续增加,都会导致溢出,增加风险。这样看来,0x3f3f3f3f 无疑要比这个数更合适的。

总结

0x3f3f3f3f 是一个非常大的数,实际上我们可以当成一个非常大的数去使用。


0x3f3f3f3f - 神奇的“超级大的数”
https://gt610.codeberg.page/2024/03/18/0x3f3f3f3f/
作者
GT610
发布于
2024年3月18日
许可协议