MENU

为何喜欢把INF设置为0x3f3f3f3f?

February 17, 2020 • Read: 1071 • 编程之路,Algorithm

为什么不用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

- - - 结束 - - -
  • 文章标题:为何喜欢把INF设置为0x3f3f3f3f?
  • 文章链接:https://blog.canye365.cn/archives/201.html
  • 版权所有:本文版权归 残夜 所有,转载请注明出处!除特殊注明外 (如有侵权,请 点此联系我 )
  • Last Modified: February 3, 2021
    Leave a Comment

    2 Comments
    1. yumeko yumeko   Android 9(Android 9) / Google Chrome 57.0.2987.108(Google Chrome 57.0.2987.108)

      memset一般初始化为0或者-1吧
      -1: 1111 1111

      1. 残夜 残夜   Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 69.0.3497.100(Google Chrome 69.0.3497.100)

        @yumeko已经修正,感谢提醒~。 ::aru:thumb::