`
Rainbow702
  • 浏览: 1073047 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类

Java 的数值是怎么存储的

    博客分类:
  • Java
阅读更多

今天来说说Java中,数值的二进制格式是怎么样的。

 

如果你能很快的写出下面五条System out 的结果,那么,你可以不用继续看本博客了,因为你看下去也是浪费时间。^_^

 

 

int min = Integer.MIN_VALUE;
int min2 = Integer.MIN_VALUE - 1;

int max = Integer.MAX_VALUE;
int max2 = Integer.MAX_VALUE + 1;

System.out.println(-1 + " : " + Integer.toBinaryString(-1));
System.out.println(min + " : " + Integer.toBinaryString(min));
System.out.println(min2 + " : " + Integer.toBinaryString(min2));
System.out.println(max + " : " + Integer.toBinaryString(max));
System.out.println(max2 + " : " + Integer.toBinaryString(max2));

 

 

我们知道,Java中,int 型数据的是4个字节的,最大长度为 4*8 = 32.

而,int 是有符号类型的数据,所以,最高位的数值是用来表示正数或者负数的。1为负,0为正。

所以,对于int 型的最大值 Integer.MAX_VALUE 而言,它的二进制的格式,我们应该都能很快写出:

 

0111 1111 1111 1111 1111 1111 1111 1111 

最高位的0,是用来表示这是一个正数。

 

既然 Integer.MAX_VALUE 已经是最大值了,那么, Integer.MAX_VALUE + 1 应该等于什么呢?

下面我们就来算一下:

 

    0111 1111 1111 1111 1111 1111 1111 1111
  +                                       1
  -----------------------------------------------
  = 1000 0000 0000 0000 0000 0000 0000 0000

大家对这个算术结果都没问题吧?

那么,“1000 0000 0000 0000 0000 0000 0000 0000” 这个值是多少呢?下面进行说明。

首先,大家应该注意到,这个数字的最高位已经变成了“1”,所以,这个数已经变成了一个负数了。

那么,对于一个负数,它的值要怎么计算呢?

这个就要说到一个Java规范了:Java是基于2的补码算术来计算数值的,对于负数,则需要对每一位进行取反,最后加1,即得到数值。

根据这个规范,我们来计算一下“1000 0000 0000 0000 0000 0000 0000 0000” 的值:

        1    000 0000 0000 0000 0000 0000 0000 0000
取反    1    111 1111 1111 1111 1111 1111 1111 1111
加1                                               1  
------------------------------------------------------
=       1    1000 0000 0000 0000 0000 0000 0000 0000

把最左边的符号位与其他的数据位隔了比较大的距离,这样看起来比较方便。

 

大家会发现,运算得到的值有 33 位了。

我们这样理解: 最高位(即最左边) 的1 是符号位,1 表示负值。其余的32位,值为 2^31。所以,结合起来看,“1 000 0000 0000 0000 0000 0000 0000 0000” 的值就是 -2^31

看到这,大家肯定都发现了,这个值就是 Integer.MIN_VALUE 的值。对的!!,所以 Integer.MIN_VALUE的二进制格式就是“”“1 000 0000 0000 0000 0000 0000 0000 0000” 。

 

既然 Integer.MAX_VALUE + 1 = Integer.MIN_VALUE, 那么 Integer.MIN_VALUE -1 当然就等于Integer.MAX_VALUE  喽。

 

上面说了,对于负数,Java是对各位进行取反加1计算得出值的,那么,我们现在,来反推一下  “-1” 这个数,在Java中,它对应的 二进制格式是什么样的。

如果,用原码表示,它应该是这样的:

1 000 0000 0000 0000 0000 0000 0000 0001

 既然Java在计算的时候,采取的是针对补码进行 “取反加1” 来计算的,那么,我们理所当然的会想到,对上面的原码进行“减1取反”来得到它的补码吧:

        1 000 0000 0000 0000 0000 0000 0000 0001
减1     -                                      1
     ------------------------------------------------
	 =	1 000 0000 0000 0000 0000 0000 0000 0000
取反    1 111 1111 1111 1111 1111 1111 1111 1111 

 所以,Java中,“-1”的二进制格式当然就是:

11111111111111111111111111111111

 

 

好了,到此,应该可以给出本文最初的5个 System out 的输出了吧?它们就是:

 

-1 : 11111111111111111111111111111111
-2 : 11111111111111111111111111111110
-2147483648 : 10000000000000000000000000000000
2147483647 : 1111111111111111111111111111111
2147483647 : 1111111111111111111111111111111
-2147483648 : 10000000000000000000000000000000

 

 

题外话:对于数据的溢出,我是这么看的:

我一直把int的数据范围看成是一个环形,如下图。

最大值,往左一步(即,+1)就变成最小值;

最小值,往右一步(即,-1)就变成最大值

 



 

 

 

  • 大小: 18.9 KB
分享到:
评论

相关推荐

    java 调用存储过程

    在这个例子中,我们创建了一个`CallableStatement`实例,设置参数值,然后执行存储过程。执行后,我们从结果集中获取并处理数据。 值得注意的是,上述代码中的文件名列表(如Project1.cfg、Unit1.dcu等)与Java调用...

    java调用oracle存储过程或者函数

    在Java编程中,调用Oracle数据库的存储过程和函数是常见的任务,这通常涉及到JDBC(Java Database Connectivity)API的使用。以下将详细介绍这个过程,包括必要的步骤、使用的类和方法,以及可能遇到的问题和解决...

    Java调用数据库存储过程[mysql测试通过]

    在Java编程中,调用数据库存储过程是一种常见的操作,特别是在处理复杂的业务逻辑或者批量数据操作时。本篇文章将深入探讨如何使用Java与MySQL数据库进行交互,实现调用存储过程,并提供一个测试通过的实例。 首先...

    java调用存储过程(含out参数)

    在Java编程中,调用数据库的存储过程是常见的任务,特别是在处理复杂的业务逻辑或需要高效数据操作时。本文将详细讲解如何在Java中调用含有`OUT`参数的存储过程,帮助开发者解决这类问题。 首先,理解存储过程的...

    JAVA调用ORACLE存储过程

    ### JAVA调用ORACLE存储过程知识点详解 #### 一、背景与概述 在现代软件开发过程中,集成多种技术栈是常态。特别是在企业级应用中,Java 和 Oracle 数据库的组合非常常见。通过 Java 调用 Oracle 存储过程不仅能够...

    Java程序调用存储过程

    Java程序调用存储过程是数据库操作中的常见任务,特别是在处理大量数据或需要高效执行复杂业务逻辑时。存储过程是预编译的SQL语句集合,它们可以提高性能、减少网络流量,并提供更好的安全性。在Java应用程序中调用...

    Java调用Mysql存储过程

    在Java编程中,调用MySQL存储过程是一种常见的数据库交互方式,尤其在处理复杂业务逻辑或大量数据操作时。本文将详细讲解如何通过Java来执行MySQL的存储过程。 首先,了解存储过程的基本概念。存储过程是预编译在...

    java 调用db2存储过程

    这个存储过程使用了输入参数 inparam,并根据其值执行不同的操作。 四、 Java 调用带有输入参数的存储过程 要在 Java 中调用带有输入参数的存储过程,需要使用 CallableStatement 对象,并将输入参数传递给存储...

    在java中使用存储过程

    如果存储过程中有输出参数,则需要使用`registerOutParameter`方法注册输出参数,然后通过`getXXX`系列方法获取输出参数的值。 示例代码: ```java // 假设存储过程中的输出参数为整型 cstmt.registerOutParameter...

    java调用oracle存储过程实现增删改查

    在Java编程中,调用Oracle数据库的存储过程是常见的数据操作任务,特别是在处理复杂的业务逻辑或需要高效批量处理数据时。存储过程是预编译的SQL语句集合,可以提高性能,减少网络流量,并增强安全性。本文将详细...

    java 调用存储过程返回单个值

    本文将详细介绍如何通过Java程序来调用一个返回单个值的存储过程,并且该过程支持参数传递。此方法通常利用了`CallableStatement`接口,它是`PreparedStatement`的子接口,专门用于执行SQL存储过程或函数。 ### 一...

    java调用oracle存储过程返回结果集,Record,cursor参照.pdf

    Java调用Oracle存储过程返回结果集Record、Cursor参照 Java调用Oracle存储过程返回结果集(Record)是指在Java程序中通过调用Oracle存储过程来获取记录集的结果。下面将详细介绍相关知识点。 创建Type 在Oracle中...

    java 调存储过程

    在Java编程中,调用数据库存储过程是一种常见的操作,特别是在处理复杂的业务逻辑或者批量数据操作时。存储过程是由一组SQL语句组成的预编译代码,它们存储在数据库中,可以被多次调用,提高效率并简化代码管理。...

    JAVA调用ORACLE存储过程通用类

    ### JAVA调用ORACLE存储过程通用类 #### 概述 在Java开发中,经常会遇到需要与数据库交互的情况,特别是当涉及到复杂的业务逻辑时,利用数据库的存储过程可以有效地提高程序性能并简化代码结构。本篇文章将详细...

    JAVA调用存储过程

    ### JAVA调用存储过程知识点详解 #### 一、无结果集返回的存储过程调用 在Java中调用不返回结果集的存储过程时,主要步骤包括建立连接、准备调用语句、设置输入参数、执行存储过程以及处理可能产生的警告信息。 1...

    java调用存储过程实例

    在IT领域,特别是数据库操作与Java编程的交集部分,调用存储过程是常见的需求之一。根据提供的文件信息,我们可以深入解析如何在Java中通过JDBC(Java Database Connectivity)调用Oracle数据库的存储过程。 ### ...

    java中存储过程的使用

    ##### (四)Java中调用返回多个值的存储过程 调用返回多个值的存储过程的示例代码如下: ```java public static void main(String[] args) { try { Class.forName("oracle.jdbc.driver.OracleDriver"); ...

    java操作mysql存储过程的例子.doc

    在Java编程中,与MySQL数据库进行交互是常见的任务,其中涉及到的一个高级特性就是操作存储过程。存储过程是预编译的SQL语句集合,可以包含条件判断、循环等控制流语句,提供了一种更高效、更安全的方式来执行数据库...

    Java调用oracle存储过程通过游标返回临时表

    3. **设置参数**:根据存储过程的输入参数类型,使用`setXXX()`方法设置参数值。如果存储过程返回游标,我们需要声明一个`OUT`参数来接收。 4. **执行存储过程**:通过`pstmt.execute()`执行存储过程。这将打开一个...

Global site tag (gtag.js) - Google Analytics