今天来说说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)就变成最大值
相关推荐
在这个例子中,我们创建了一个`CallableStatement`实例,设置参数值,然后执行存储过程。执行后,我们从结果集中获取并处理数据。 值得注意的是,上述代码中的文件名列表(如Project1.cfg、Unit1.dcu等)与Java调用...
在Java编程中,调用Oracle数据库的存储过程和函数是常见的任务,这通常涉及到JDBC(Java Database Connectivity)API的使用。以下将详细介绍这个过程,包括必要的步骤、使用的类和方法,以及可能遇到的问题和解决...
在Java编程中,调用数据库存储过程是一种常见的操作,特别是在处理复杂的业务逻辑或者批量数据操作时。本篇文章将深入探讨如何使用Java与MySQL数据库进行交互,实现调用存储过程,并提供一个测试通过的实例。 首先...
在Java编程中,调用数据库的存储过程是常见的任务,特别是在处理复杂的业务逻辑或需要高效数据操作时。本文将详细讲解如何在Java中调用含有`OUT`参数的存储过程,帮助开发者解决这类问题。 首先,理解存储过程的...
Java调用Oracle存储过程返回结果集Record、Cursor参照 Java调用Oracle存储过程返回结果集(Record)是指在Java程序中通过调用Oracle存储过程来获取记录集的结果。下面将详细介绍相关知识点。 创建Type 在Oracle中...
### JAVA调用ORACLE存储过程知识点详解 #### 一、背景与概述 在现代软件开发过程中,集成多种技术栈是常态。特别是在企业级应用中,Java 和 Oracle 数据库的组合非常常见。通过 Java 调用 Oracle 存储过程不仅能够...
KV存储是一种数据存储模型,其中每个数据项由一个唯一的键(Key)和对应的值(Value)组成,通过键来查找和访问数据,具有简单、快速的特点。在分布式环境下,KV存储系统通常采用一致性哈希、分区策略等技术,确保...
Java程序调用存储过程是数据库操作中的常见任务,特别是在处理大量数据或需要高效执行复杂业务逻辑时。存储过程是预编译的SQL语句集合,它们可以提高性能、减少网络流量,并提供更好的安全性。在Java应用程序中调用...
在Java编程中,调用MySQL存储过程是一种常见的数据库交互方式,尤其在处理复杂业务逻辑或大量数据操作时。本文将详细讲解如何通过Java来执行MySQL的存储过程。 首先,了解存储过程的基本概念。存储过程是预编译在...
这个存储过程使用了输入参数 inparam,并根据其值执行不同的操作。 四、 Java 调用带有输入参数的存储过程 要在 Java 中调用带有输入参数的存储过程,需要使用 CallableStatement 对象,并将输入参数传递给存储...
3. **设置参数**:根据存储过程的输入参数类型,使用`setXXX()`方法设置参数值。如果存储过程返回游标,我们需要声明一个`OUT`参数来接收。 4. **执行存储过程**:通过`pstmt.execute()`执行存储过程。这将打开一个...
如果存储过程中有输出参数,则需要使用`registerOutParameter`方法注册输出参数,然后通过`getXXX`系列方法获取输出参数的值。 示例代码: ```java // 假设存储过程中的输出参数为整型 cstmt.registerOutParameter...
本文将详细介绍如何通过Java程序来调用一个返回单个值的存储过程,并且该过程支持参数传递。此方法通常利用了`CallableStatement`接口,它是`PreparedStatement`的子接口,专门用于执行SQL存储过程或函数。 ### 一...
在Java编程中,调用数据库存储过程是一种常见的操作,特别是在处理复杂的业务逻辑或者批量数据操作时。存储过程是由一组SQL语句组成的预编译代码,它们存储在数据库中,可以被多次调用,提高效率并简化代码管理。...
### JAVA调用ORACLE存储过程通用类 #### 概述 在Java开发中,经常会遇到需要与数据库交互的情况,特别是当涉及到复杂的业务逻辑时,利用数据库的存储过程可以有效地提高程序性能并简化代码结构。本篇文章将详细...
### JAVA调用存储过程知识点详解 #### 一、无结果集返回的存储过程调用 在Java中调用不返回结果集的存储过程时,主要步骤包括建立连接、准备调用语句、设置输入参数、执行存储过程以及处理可能产生的警告信息。 1...
在IT领域,特别是数据库操作与Java编程的交集部分,调用存储过程是常见的需求之一。根据提供的文件信息,我们可以深入解析如何在Java中通过JDBC(Java Database Connectivity)调用Oracle数据库的存储过程。 ### ...
##### (四)Java中调用返回多个值的存储过程 调用返回多个值的存储过程的示例代码如下: ```java public static void main(String[] args) { try { Class.forName("oracle.jdbc.driver.OracleDriver"); ...
在Java编程中,与MySQL数据库进行交互是常见的任务,其中涉及到的一个高级特性就是操作存储过程。存储过程是预编译的SQL语句集合,可以包含条件判断、循环等控制流语句,提供了一种更高效、更安全的方式来执行数据库...