为什么无穷大总是0x3f3f3f3f而不是0x7fffffff?
如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。
且听我慢慢道来,为什摸0x7fffffff为什摸不是个好的选择
1.但在很多情况下,0x7fffffff会出现错误,比如溢出。
这样两个无穷大数相加会变成负数,还有如在做dijkstra求最短路时,当做松弛操作,判断if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v],
若u到v没有路劲,w[u][v]=0x7fffffff,这样d[u]+w[u][v]会变成负数,这就产生了错误。
无穷大加无穷大依然是无穷大”,至少两个无穷大相加不应该出现灾难性的错误,这一点上0x7fffffff依然不能满足我们
if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];
准确来说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”这个条件,它会变成了一个很小的负数。
来个小测试及更明白了
#include<stdio.h>
#include<string.h>
#define MAX1 0x7fffffff
#define MAX2 0x3f3f3f3f
int a[3];
int main()
{memset(a,0x3f,sizeof(a));printf("%d\n",MAX1);printf("%d\n",MAX1*2);printf("%d\n",MAX2);printf("%d\n",MAX2*2);for(int i=0;i<3;i++)printf("%d ",a[i]);printf("\n");return 0;
}
2.由于一般的数据不会大于10^9,把无穷大加上一个数据时,它并不会溢出(“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足“无穷大加无穷大还是无穷大”的需求。
3. 最后最后!!
0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果将某个数组清零,通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。
所以在通常的场合下,const int INF = 0x3f3f3f3f;真的是一个非常棒的选择。
转载于https://blog.csdn.net/mlm5678/article/details/82729974
为什么无穷大总是0x3f3f3f3f而不是0x7fffffff?相关推荐
- 0x3f3f3f3f和0x7fffffff所代表的无穷大
如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值.如果这个无穷大只用于一般的比较(比如求最小值 ...
- 编程中无穷大的设定 很多人可能设为0x7fffffff,这个数的确是32-bit int的最大值,符号位为0,其他的都是1 但在很多情况下,0x7fffffff会出现错误,比如溢出,这样两个无穷大数相
很多人可能设为0x7fffffff,这个数的确是32-bit int的最大值,符号位为0,其他的都是1 但在很多情况下,0x7fffffff会出现错误,比如溢出,这样两个无穷大数相加会变成负数,还有如 ...
- QAQ……#define INF 0x3f3f3f3f 原来是定义成无穷大
经常在参观大佬的博客的时候看到这种写法,百思不得其解, "0x3f3f3f3f "是什么?/*虽然,似乎,好像刚刚看过进制转换--就当我选择性失忆吧*/ ------------- ...
- const int INF=0x3f3f3f3f;——ACM中的无穷大常量
0x3f3f3f3f 0x开头的 是十六进制常数, 等于 十进制 1061109567 等于 二进制: 00111111 00111111 00111111 00111111 const int in ...
- 0x3f3f3f3f,0x7fffffff 用于赋值
1. memset函数 memset函数是按字节进行赋值的,经常用于赋值0或者-1, 但正规的用法应该是用于char数组的, 即只能赋值为0x00到0xFF, 例如memset(,0xff,sizeo ...
- memset详解 设置无穷大INF
http://www.xuebuyuan.com/1442940.html memest原型 (please type "man memset" in your shell) ...
- 关于0x3f3f3f3f(0x四个3f)
在之前一道最小生成树问题中遇到过,我按照以前的习惯把INF定义为10亿,然后初始化数组为最大值,然后输入连通的路+value,最后值仍然为INF的即为不通的.但是这里出问题了,INF定义为10亿的话, ...
- 0x3f3f3f3f
编程中无穷大常量的设定技巧 如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值.如果这个无穷大只 ...
- 【C语言中如何表示无穷大】
0x3f3f3f3f表示无穷大 许多时候我们可能需要设置一个无穷大的变量,最严谨的办法当然是对无穷大进行特别处理而不是找一个很大很大的常量来代替它(或者说模拟它),但是这样会让我们的编程过程变得很麻烦 ...
最新文章
- 一个简单的 Python-kivy 小程序
- mpi tcp连接报错_MPI分布式编程 --3.OpenMPI多节点运行报错
- 数据挖掘竞赛-轴承故障检测训练赛
- fiddler设置https抓包
- thinkpadt450s换键盘视频_ikbc c87 入门级有线机械键盘测评
- 数据--dp,线段树优化
- 机器学习深度学习知识点总结
- 基于HTML5的WebGL实现的2D3D迷宫小游戏
- 【滤波跟踪】捷联惯导纯惯导解算matlab实现
- 影视剪辑,视频剪辑素材音效哪里找?超实用剪辑入门必备素材
- stm32(十八)TFT-LCD
- pandas精华总结
- Ubuntu安装有道词典出现缺少依赖关系问题
- 交叉编译ffmpeg
- 微信第三方登录,主要手机没有安装微信处理
- python学习实验报告(第一周)
- 抖音和tiktok是什么关系?TikTok和抖音差别大吗?
- 深度学习相关学术会议
- matlab电力电子技术仿真错误,Matlab在电力电子技术仿真中的应用
- 办公自动化:PDF文件合并器,用Python将多个PDF文件进行合并
热门文章
- Java 重写paint绘图
- 制造企业制造执行系统的优势是什么?
- activity连线,排他网关和并行网关以及接收任务
- 推荐几款1500元左右适合初学者入门吉他评测分析
- Android 小程序APP成语字典课程设计
- 机器学习流程及详细内容(2)
- 早恋html5,陷入“早恋”的学生,一般会买3样东西,全中送“兰5券”一张!
- 输入任意实数X,编写程序,计算e^x的近似值,直到最后一项的绝对值小于10^-6为止(python)
- 修改android系统开机动画
- 用于表检测和结构识别的深度学习:综述