&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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Android开发】范例2-实现放大镜效果

    【Android开发】范例2-实现放大镜效果

    2021年9月6日
    53
  • js遍历对象属性的一些方法有哪些_js面试遍历对象的所有属性

    js遍历对象属性的一些方法有哪些_js面试遍历对象的所有属性1.Reflect.ownKeys()静态方法Reflect.ownKeys()返回一个由目标对象自身的属性键组成的数组。2.Object.entries(obj)Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用for…in循环遍历该对象时返回的顺序一致(区别在于for-in循环还会枚举原型链中的属性)。3.Object.fromEntr…

    2022年10月20日
    4
  • 基于rv1108的以太网PHY层芯片LAN8720A的使用简介

    基于rv1108的以太网PHY层芯片LAN8720A的使用简介lan8720a的系统框图:以下是lan8720a的芯片的内部架构框图:lan8720a的芯片引脚的描述:实际项目中硬件的连接:rv1108部分的原理图:lan8720部分的原理图:从原理图上来看,lan8720a的引脚LED1/REGOFF是处于悬空状态,使用了lan8720a芯片内部集成的1.2V稳压器。引脚RXER/PHYAD0直接接到芯片的…

    2022年6月16日
    73
  • ABAP WDA

    ABAP WDA一、20181217-20181226笔记selection_options和alv 二、相关服务1、事务码:SICF默认SERVICE,执行。Service:default_host/sap/option/*default_host/sap/public/bc/*default_host/sap/bc/wdvddefault_host/sap/bc/webdynp…

    2022年7月12日
    21
  • JVM 类加载机制_类加载机制的作用和过程

    JVM 类加载机制_类加载机制的作用和过程一、概述我们知道java代码会被编译为.class文件,这里class文件中的类信息最终还是需要jvm加载以后才能使用。事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转

    2022年8月16日
    6
  • android应用程序_chrome Android

    android应用程序_chrome Android最近在看Android源码Setting代码的时候,发现其中配置都是用的PreferenceFragment,以前对这一块不是很了解,查资料看了一下,感觉用起来好方便。      PreferenceFragment的界面也是写在一个XML文件中,不过不是放在layout目录下,需要自己在res下面新建一个xml命名的文件夹,然后在该文件夹下再新建一个xml文件,这个文件就是我们Pref

    2025年9月26日
    4

发表回复

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

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