&0xffffffff(0x08)

答案是-2为什么呢这里涉及到有符号整型数的补码,正数的补码与原码相同。负数的补码,将其原码除符号位外的所有位取反后加101111111+01111111=11111110符号位溢出了取反10000001再加110000010结果就得-2在网上看别人代码的时候,经常会看到他们把INF设为0x7fffffff,奇怪为什么设一个这么奇怪的十六进制数,一…

大家好,又见面了,我是你们的朋友全栈君。

答案是 -2
为什么呢 

这里涉及到有符号整型数的补码,正数的补码与原码相同。负数的补码,将其原码除符号位外的所有位取反后加1

0111 1111
+ 0111 1111
= 1111 1110
符号位溢出了
取反
1000 0001
再加1
1000 0010
结果就得-2 

 

在网上看别人代码的时候,经常会看到他们把INF设为0x7fffffff,奇怪为什么设一个这么奇怪的十六进制数,一查才知道,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择。

但是更多情况下,0x7fffffff并不是一个好的选择,比如在最短路径算法中,我们使用松弛操作:

if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];

如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛操作便出错了!

准确来说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”这个条件,它会变成了一个很小的负数。

更进一步的,如果有一个数能够满足“无穷大加无穷大依然是无穷大”,那么就更好了!

前阵子无意中看到了一个不一样的取值,INF=0x3f3f3f3f,这时我又郁闷了,这个值又代表的是什么?于是我去寻找答案,发现这个值的设置真的很精妙!

0x3f3f3f3f的十进制是1061109567,是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。 
另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。

最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处: 
如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a)),方便又高效,但是当我们想将某个数组全部赋值为无穷大时,就不能使用memset函数而得自己写循环了,因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0(一般我们只有赋值为-1和0的时候才使用它)。现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。

所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128600.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2019年C-NPS研究成果发布 中国品牌赢得更多肯定

    2019年C-NPS研究成果发布 中国品牌赢得更多肯定中新网1月15日电15日,品牌评级权威机构Chnbrand发布2019年(第五届)中国顾客推荐度指数(C-NPS)品牌排名和分析报告。该指数是中国首个顾客推荐度评价体系,2015年首次推出并获得工业和信息化部品牌政策专项资金的扶持。此次报告显示,2019年C-NPS略有提升,总分为8.4分,较去年提升1.5分;服务业净推荐值依然领先,耐用消费品行业和快速消费品行业位列第二、三位;中国品牌正在赢…

    2022年5月20日
    35
  • LDAP概述

    LDAP概述

    2021年8月29日
    100
  • 神经网络学习小记录-番外篇——常见问题汇总

    神经网络学习小记录-番外篇——常见问题汇总神经网络学习小记录-番外篇——常见问题汇总前言问题汇总1、下载问题2、环境配置问题3、shape不匹配问题a、训练时shape不匹配问题b、预测时shape不匹配问题4、nomodule问题5、显存问题6、训练问题7、乱七八糟的问题前言搞个问题汇总吧,不然一个一个解释也挺难的。问题汇总1、下载问题问:up主,可以给我发一份代码吗,代码在哪里下载啊?答:Github上的地址就在视频简介里。复制一下就能进去下载了。问:up主,为什么我下载的代码里面,model_data下面没有.pth或者.h

    2022年5月4日
    87
  • windows在当前目录打开命令行_在当前目录打开命令行

    windows在当前目录打开命令行_在当前目录打开命令行首先,按下快捷键win+R,然后输入cmd,回车,这样就打开了命令行如上图,默认打开之后都是在C盘,接下来输入cd/,回车,接着输入要去的目录,比如我要打开我的D盘,输入d:回车然后我要打开D盘下的某一目录,比如我要打开D/Vscode文件夹/node这个目录:输入cdVscode文件夹,回车,继续输入cdnode,回车这种单个打开的方法虽然没问题,但是这样显得我们和计算机都有点迟钝,那有没有可以直接一次性打开根目录的方法呢?…

    2022年10月15日
    2
  • anycast隧道_讲述IPv6网络中的选播概述及Anycast困难解决方法

    anycast隧道_讲述IPv6网络中的选播概述及Anycast困难解决方法APanoramaofAnycastinIPv6NetworksSUNFei,LIZhi-tang,LIYao(NetworkCentre,HuazhongUniversityofScienceandTecnology,Wuhan430074)Abstract:Anycastisanew“one-to-one-of-many”communicati…

    2022年5月23日
    47
  • nginx配置url重定向_Nginx 跳转到www二级域名,域名重定向配置方法。[通俗易懂]

    nginx配置url重定向_Nginx 跳转到www二级域名,域名重定向配置方法。[通俗易懂]阿里(万网)支持显性URL配置,也就是:将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址(例如:将sojson.com显性转发到www.sojson.com后,访问sojson.com时,地址栏显示的地址为:www.sojson.com)。其实就是重定向,我以前觉得阿里的挺好用的,今天阿里给我说服务器给攻击了,不提供服务。下面是我和阿里的客服对话,我对阿里的服务表示有点失望。我…

    2022年5月21日
    119

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号