int型变量的取值范围:[-2^31, 2^31 - 1]  ->  [-2147483648, 2147483647]0x7fffffff = 2147483647= (2^31 - 1)= (1 << 31) - 10x3fffffff = 1073741823= (2^30 - 1)= (1 << 30) - 10x3f3f3f3f = 1061109567

在写算法题目时常常需要用到无穷大,比如在求图的最短路径时,就需要先将源点到各点的最短距离设置为无穷大。

在十进制表示下,0x7fffffff = 2147483647,恰好等于int型变量的上界,所以在一些情况下用0x7fffffff表示无穷大是一个很好的选择。

这些情况包括但不限于数的比较,min(num, 0x7fffffff),一开始设置num是0x7fffffff,用这个式子判断是否num已改变

但是对于很多情况,设置无穷大为0x7fffffff并不能满足我们的需求。因为对于无穷大,加上一个数应该还是无穷大。而在计算机中,0x7fffffff加上一个数后会溢出,不仅不再是无穷大,还可能是负数。

显然需要换个数来表示无穷大,这次我们选择 0x3fffffff,这个数用十进制表示是(1 << 30) - 1。因为一般场合下程序中的数据都是小于1e9的,而0x3fffffff = 1073741823 > 1e9。那么这个数不仅满足了比程序中的任何数都大,而且0x3fffffff + 0x3fffffff = (1 << 31) - 2小于int型的边界(1 << 31) - 1 = 2147483647,所以也满足了无穷大加上一个数还是无穷大。

除了用0x3fffffff表示无穷大之外,我们还经常能看到用 0x3f3f3f3f 表示无穷大。和0x3fffffff一样,一般场合下的数据都是小于1e9的,而0x3f3f3f3f = 1061109567 > 1e9。0x3f3f3f3f + 0x3f3f3f3f = 2122219134 < int型的边界(1 << 31) - 1 = 2147483647,也满足无穷大加上一个无穷大还是无穷大。

不仅如此,如果要对一个数组全部赋值无穷大时,使用循环赋值不如使用memset赋值快。memset是按字节赋值的,它能够对数组清零 memset(arr, 0, sizeof(arr))(因为0的每个字节都是0);或者全部赋值-1 memset(arr, -1, sizeof(arr))(-1在计算机中的表示形式为111 … ,每个字节都是11111111);由于0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部设置为无穷大时,我们只需要 memset(arr, 0x3f, sizeof(arr))

对于上述三种对无穷大的定义,除了第一种需要根据题目要求判断是否需要有无穷大加上一个数的操作来选择之外,选择哪种定义取决于个人喜好。

#define INF1 0x7fffffff
#define INE2 0x3fffffff
#define INF3 0x3f3f3f3f
// 不推荐使用上面的宏定义
// 我们只是设置一个常量而已,使用 const 就好
const int INF4 = 0x7fffffff;
const int INF5 = 0x3fffffff;
const int INF6 = 0x3f3f3f3f;

无穷大常量0x7fffffff 0x3fffffff 0x3f3f3f3f相关推荐

  1. mysql中无穷大如何表示_编程中无穷大常量的设置技巧

    如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值.如果这个无穷大只用于一般的比较(比如求最小值 ...

  2. 0x7fffffff与0x3f3f3f3f

    0x7fffffff和0x3f3f3f3f都是十六进制的数,0x7fffffff表示的是32字节的最大值,而0x3f3f3f3f的两倍还不如前者大,但某些时候后者比前者好用,比如与另一个数相加,这时结 ...

  3. const int INF=0x3f3f3f3f;——ACM中的无穷大常量

    0x3f3f3f3f 0x开头的 是十六进制常数, 等于 十进制 1061109567 等于 二进制: 00111111 00111111 00111111 00111111 const int in ...

  4. 编程中无穷大常量的设定技巧(ox3f3f3f3f)

    通过计算你会发现 0x3f3f3f3f 大约等于 109 而我们平时做题的数一般都会小于109所以会认会这个数是一个无穷大的数 原文: https://blog.csdn.net/qq_3126776 ...

  5. 0x3f3f3f3f和0x7fffffff所代表的无穷大

    如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值.如果这个无穷大只用于一般的比较(比如求最小值 ...

  6. 为什么无穷大总是0x3f3f3f3f而不是0x7fffffff?

    如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值.如果这个无穷大只用于一般的比较(比如求最小值 ...

  7. c语言无穷大的常量,C/C++中如何表示正无穷和负无穷

    标签: 我们可以使用系统提供的常量: 如果是int型,可以用INT_MAX表示正无穷,INT_MIN表示负无穷,需要包含头文件limits.h: 如果是double型,可以用DBL_MAX表示正无穷, ...

  8. QAQ……#define INF 0x3f3f3f3f 原来是定义成无穷大

    经常在参观大佬的博客的时候看到这种写法,百思不得其解, "0x3f3f3f3f "是什么?/*虽然,似乎,好像刚刚看过进制转换--就当我选择性失忆吧*/ ------------- ...

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

    C/C++中无穷大的表示 一.为什么用0x3f3f3f3f(十进制:1061109567)表示无穷大 1.C/C++中int型的最大值是2^31-1,十进制:2147483647.16进制:0x7ff ...

  10. c++ 无穷大0x7FFFFFFF+0x7FFFFFFF 是多少

    答案是 -2 为什么呢 这里涉及到有符号整型数的补码,正数的补码与原码相同.负数的补码,将其原码除符号位外的所有位取反后加1 0111 1111 + 0111 1111 = 1111 1110 符号位 ...

最新文章

  1. 考考基础部分,谈谈Java集合中HashSet的原理及常用方法
  2. 两步实现 mysql 远程连接
  3. 【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )
  4. Scala变量的声明和赋值
  5. Flex读取XML配置文件
  6. 第七十六期:糟糕!服务器被植入挖矿木马,CPU飙升200%
  7. Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承
  8. 1000以内的回文数_杭城有学校带学生玩扑克、数糖果... “云课堂”下的数学很有趣!这些数学游戏,居家玩起来~...
  9. python qq自动接收文件_python学习之 实现QQ自动发送消息
  10. 微信电脑版关掉截屏快捷键
  11. 德国人预测世界杯: 冠军是西班牙!
  12. 杜甫水平最高的10首五律
  13. 晨曦 - 江湖一剑客
  14. 关于两个鸡蛋判断楼层问题
  15. 记一次失败的《将视频中的音频转换成文字》的经历
  16. 查找两个数储存在二进制中相同的个数
  17. vivo商城架构演进之路
  18. Java面试官最爱问的垃圾回收机制,mysqlssl连接
  19. JSP婚纱影楼管理系统myeclipse开发sql数据库bs框架java编程jdbc
  20. MPEG LA推出一站式Qi无线充电许可

热门文章

  1. x = cos x 的解析形式
  2. VMware Workstation 備份與恢復虛擬機
  3. CodeMirror自动提醒配置
  4. OkHttp3用法全解析
  5. winpcap的使用
  6. 发行盗版windows的组织为何热衷于更改系统设置
  7. hdu1019--Least Common Multiple
  8. drools rule (二) LHS语法详解
  9. 一位前端工程师的Writing better code
  10. windows 上面的tensorflow-GPU、cuda、cudnn 安装