为什么不用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
- - - 结束 - - -
memset一般初始化为0或者-1吧
-1: 1111 1111
已经修正,感谢提醒~。 ::aru:thumb::