为什么不用0x7fffffff?

一般来说要设置一个无穷大的数字,可以选择32位int​​下的最大值,也就是0x7fffffff,但这个数字看似完美但是有一个最为致命的缺陷是,进行加法运算会产生溢出,同时在很多场景更希望有一个无穷大的数字满足,无穷大+无穷大 = 无穷大,当然0x7fffffff肯定会溢出。

为什么选择0x3f3f3f3f?

  • ox3f3f3f3f十进制是$1061109567$,和0x7fffffff一样是$10^9$数量级,一般场合下的数据都是小于$10^9$的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
  • 由于一般的数据都不会超过$10^9$,因此满足无穷大+数据 = 无穷大,且不会溢出。更进一步,$0x3f3f3f3f + 0x3f3f3f3f = 2122219134$,满足无穷大+无穷大 = 无穷大,且不会溢出。
  • 还有一个被称为意想不到的额外好处,就是搭配memset(a, 0, sizeof(a))函数,当初始化一个数组为无穷大时,就不能使用这个函数,因为memset是按字节进行操作,它能够对数组清零是因为$0$的每个字节都是$0$(而事实上我们往往使用它把数组初始化为$0$或者$-1$)。这个意想不到的额外好处是,因为0x3f3f3f3f的每一个字节都是3f,所以当我们需要把一个数组初始化为无穷大时,只需memset(a, 0x3f, sizeof(a))

参考链接:https://blog.csdn.net/jiange_zh/article/details/50198097

Last modification:March 4th, 2020 at 09:33 pm
如果觉得我的文章对你有用,请随意赞赏~