C/C++无穷大的表示 0x7fffffff + 0x7fffffff= 负数

本文探讨了C/C++中使用0x3f3f3f3f作为无穷大表示的原因,避免溢出并解释了其与0x7fffffff的区别,还介绍了memset在初始化中的便利。重点在于理解这种技巧在编程实践中的实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的最大值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值