开发者社区> 问答> 正文

java中的64位数据和32位数据的区别

之前在看数据之间的相互比较的时候,遇到这样一个问题
“数值间的相等比较,本质是比较他们二进制存储是否相等。例如:0.3f==0.3返回的是false(32位的2进制的0.3表示和64位的0.3表示是不同的);但是0.5f==0.5返回的是true(因为32位和64位的二进制表示是相同的)”
那么我怎么知道要比较的这两个数在32位和64位中是否相等呢,有什么办法吗》还望给各位多多指点.

展开
收起
蛮大人123 2016-06-13 11:34:59 4481 0
2 条回答
写回答
取消 提交回答
  • 精度关系,浮点类型通常不直接做==比较,上面的例子0.3f和0.5f是float,0.3和05是double。你可以试着做一下

    System.out.println("" + Float.toHexString(0.3f) + "  " + Double.toHexString(0.3));
    System.out.println("" + Float.toHexString(0.5f) + "  " + Double.toHexString(0.5));

    然后看看结果就明白了:0x1.333334p-2 0x1.3333333333333p-2

                                       0x1.0p-1  0x1.0p-1
    2019-07-17 19:35:30
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据。如果我们将总长128位的指令分别按照16位、32位、64位为单位进行编辑的话:旧的16位处理器,比如Intel 80286 CPU需要8个指令,32位的处理器需要4个指令,而64位处理器则只要两个指令,显然,在工作频率相同的情况下,64位处理器的处理速度会比16位、32位的更快。而且除了运算能力之外,与32位处理器相比,64位处理器的优势还体现在系统对内存的控制上。由于地址使用的是特殊的整数,而64位处理器的一个ALU(算术逻辑运算器)和寄存器可以处理更大的整数,也就是更大的地址。传统32位处理器的寻址空间最大为4GB,使得很多需要大容量内存的数据处理程序在这时都会显得捉襟见肘,形成了运行效率的瓶颈。而64位的处理器在理论上则可以达到1800万个TB,1TB等于1024GB,1GB等于1024MB,所以64位的处理器能够彻底解决32位计算系统所遇到的瓶颈现象,速度快人一等,对于那些要求多处理器可扩展性、更大的可寻址内存、视频/音频/三维处理或较高计算准确性的应用程序而言,AMD 64处理器可提供卓越的性能。
    理论上来说32位的JVM有4G的堆大小限制。但是因为各种条件限制比如交换区,内核地址空间使用,内存碎片,虚拟管理机的管理开销,实际上可用的堆的大小远远比理论上的4G要少。
    在32位windows的机器上,堆最大可以达到1.4G至1.6G。
    在32位solaris的机器上,堆最大可以达到2G
    而在64位的操作系统上,32位的JVM,堆大小可以达到4G
    补充一句,在使用java参数-xms -xmx定义堆大小的时候,

    1. 如果是32bit的jvm超过4G肯定是没用的,定义了4G,最终使用到的可能只有2G
    2. 这两个值最好定义成一样,可以减少java gc的操作,有小幅度性能提高
    2019-07-17 19:35:30
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载