下面的程序(改自IBM DevelopWorks的"Getting Started with NIO"中的TypesInByteBuffer.java)用一个ByteBuffer对象存储了一个int和一个long,比较清晰的演示了int和long在内存中是如何存储的。 package com.ibm.nio;
import java.nio.ByteBuffer;
public class TypesInByteBuffer {
static public void main(String args[]) throws Exception {
ByteBuffer buffer = ByteBuffer.allocate(64);
buffer.putInt(30);
buffer.putLong(7000000000000L);
buffer.flip(); // set a breakpoint here
System.out.println(buffer.getInt());
System.out.println(buffer.getLong());
}
}
在flip处设置一个断点,查看buffer的值如下: [0, 0, 0, 30, 0, 0, 6, 93, -48, -125, 112, 0,...] 前4个字节存储int,这里是30,后8个字节存储long,这里是 7000000000000L,由于一个字节是8个bit,因此要把一个8字节的内存中的long型数ABCDEFGH转换为10进制数,计算公式是: A256^7 + B256^6 + C256^5 + D256^4 + E256^3 + F256^2 + G256 + H 如果某一位是负数,则用256减去它再进行计算。 所以用Pyhton语法验证就是:62565+93*2564+(256-48)2563+(256-125)256*2+112256,结果就是 7000000000000L。
对于浮点数(float和double型),转换为二进制相对复杂些,参见"IEEE Standard 754 Floating Point Numbers",除了Java语言,C、C++、C#等也都使用相同的方法存储整数和浮点数。