0x3f3f3f3f
的十进制是1061109567
,是10^9
级别的(和0x7fffffff
一个数量级),而一般场合下的数据都是小于10^9
的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
另一方面,由于一般的数据都不会大于10^9
,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f
+0x3f3f3f3f
=2122219134
,这非常大但却没有超过32-bit int
的表示范围,所以0x3f3f3f3f
还满足了我们“无穷大加无穷大还是无穷大”的需求。
最后,0x3f3f3f3f
还能给我们带来一个意想不到的额外好处:
如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))
,方便又高效,但是当我们想将某个数组全部赋值为无穷大时,就不能使用memset函数而得自己写循环了,因为memset
是按字节操作的,它能够对数组清零是因为0的每个字节都是0(一般我们只有赋值为-1和0的时候才使用它)。现在好了,如果我们将无穷大设为0x3f3f3f3f
,那么奇迹就发生了,0x3f3f3f3f
的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))
。
所以在通常的场合下,0x3f3f3f3f
真的是一个非常棒的选择!