前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么是 0x3f ?

为什么是 0x3f ?

作者头像
Piper蛋窝
发布2021-09-15 12:48:35
5.9K0
发布2021-09-15 12:48:35
举报
文章被收录于专栏:Piper蛋窝

unsplash.com/@polina_art

为什么是 0x3f

dijkstra 等等经典算法时;我们希望 dist 数组初始值是 无穷大 的数,常常会用到 memset(dist, 0x3f, sizeof dist) 。为什么要给 dist 赋值为 0x3f3f3f3f 呢?

首先我们看一下 0x3f 有多大。

代码语言:javascript
复制
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
    int a[1];
    memset(a, 0x3f, 4);
    cout << a[0];
}

输出 1061109567 ,是10^9级别的。

memset 按照字节赋值,因此我们把 4 个 0011 1111 填充到 32 位的 int 上。但问题是,为什么不是 0x4f 或者 0x5f

首先 10^9 级别足够大,其次,也是最重要的,0x3f3f3f3f + 0x3f3f3f3f 等于 0x7e7e7e7e不会爆int

在很多算法中,我们需要进行诸如 dist[j] > dist[t] + w[t][j] 之类的判断,如果两个大于 0x3f3f3f3f 的数相加,那么后果不堪设想。因为溢出并不会报错,算法逻辑复杂,我们往往很难定位真正的错误。

附:近期收集了很多 C++ STL 的妙用... 如下图片的 C++ 确实有点感触。

笔记主要放在 github/PiperLiu/ACMOI_Journey[1] 的“经验”中。有空一并整理。

此外,memset 对于不同的数据类型初始值当然是不同的,有一篇极好的文章:【自用】 memset对于int、long long、float、double 的极值怎么清[2],阅读原文也可查看。比如 int 对应 0x3f, float 对应 0x4f

值得注意的是,我最近在看歪总代码时,用到初始化 -INF ,直接 memset(a, -0x3f, sizeof a) 也是可以的,无非就是 0x3f 取反加一嘛,从 0011 1111 变为 1100 0001 。但是相加会爆。

参考资料

[1]

github/PiperLiu/ACMOI_Journey: https://github.com/PiperLiu/ACMOI_Journey

[2]

【自用】 memset对于int、long long、float、double 的极值怎么清: https://blog.csdn.net/vmurder/article/details/46537613

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Piper蛋窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档