C/C++中无穷大的表示
一、为什么用0x3f3f3f3f(十进制:1061109567)表示无穷大
1、C/C++中int
型的最大值是2^31-1
,十进制:2147483647。16进制:0x7fffffff
2、0x3f3f3f3f和0x7fffffff(十进制:2147483647)一样都是10的9次方级别,足够大
3、0x3f3f3f3f符合:无穷大 + 无穷大 = 无穷大的原则
而 0x7fffffff + 0x7fffffff = 负数
4、初始化数组元素为无穷大时可以使用memset
函数,更加方便(这需要了解memset
函数的原理)
memset
函数用于字符串的初始化,char
类型占一个字节,所以在使用memset
函数初始化字符串时,是一个字节一个字节初始化的。虽然该函数也能用于int
数组的初始化,但int
占4个字节,memset
函数会向每个int
型变量的每个字节写入相同的值。所以要把数组初始化成0x7fffffff需要循环赋值。而0x3f3f3f3f的每个字节都是0x3f,可以直接用memset
初始化,很方便。
memset(a,0x3f,sizeof(a)) //把一段内存置于无穷大
2. 0x7fffffff + 0x7fffffff = 负数
0x7fffffff是32位int
型的最大值,符号位为0,其他位都是1。所以再给它加上一个任意大小的数就会溢出,变成一个很小的负数,这违背了无穷大加一个数还是无穷大。
注:
使用memset
一般只用来初始化0、-1、0x3f这几个数字,其他值需要使用循环初始化。
有可能你想问:为什么不用0x40404040?
因为两个0x40404040相加也已经超过了int
的最大值。