文章目录

  • 1. 什么是大端小端
  • 2. java中用的是大端和小端


1. 什么是大端小端

Java非字节类型的基本类型,除了布尔型都是由组合在一起的几个字节组成的。这些数据类 型及其大小总结在下表 中:

数据类型

大小(以字节表示)

Byte

1

Char

2

Short

2

Int

4

Long

8

Float

4

Double

8

每个基本数据类型都是以连续字节序列的形式存储在内存中。例如,32 位的 int 值 0x037fb4c7(十进制的 58,700,999),占4个字节,如果是大端字节顺序则如左图所显示的那样被塞入内存字节中 (内存地址从左往右增加)。如果是小端字节顺序,则低位(例如03)放在字节的小端,如下面的两个图:

byte java 小端 java 大端 小端float_byte java 小端

多字节数值被存储在内存中的方式一般被称为 endian-ness(字节顺序)。如果数字数值的最高字节——big end(大端),位于低位地址,那么系统就是大端字节顺序(如左图所示)。如果最低字节最先保存在内存中,那么就是小端字节顺序(如右图所示)。记忆方法就是看谁先放于低位地址,如果是高位字节就是大端;如果是 低位字节就是小端。

字节顺序很少由软件设计者决定,它通常取决于硬件设计。字节顺序的两种类型有时被称为字节性别,在当今被广泛使用。两种方式都具有自身的优势。

我们常见的windows和linux均采用小端模式

另外需要注意的是数据的网络传输,跨不同的系统,接收同样的数据,可能要反向处理。

2. java中用的是大端和小端

安装前面的分析,取决于硬件,需要区分当前系统,那么我们通过windows7 x86 结构验证:

工具类,反射提供Unsafe 实例:

import sun.misc.Unsafe;

import java.lang.reflect.Field;

public class UnsafeInstance {

    public static Unsafe reflectGetUnsafe() {
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            return (Unsafe) field.get(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

我们放入一个long类型的数据,然后读取第一个字节(内存中,第一个字节是低地址上的),查看对应的是大端还是小端:

import sun.misc.Unsafe;

public class Test {

    public static void main(String[] args) throws InterruptedException {
        Unsafe unsafe = UnsafeInstance.reflectGetUnsafe();
        long a = unsafe.allocateMemory(8L);
        try {
            unsafe.putLong(a, 0x0102030405060708L);
            //存放此long类型数据,实际存放占8个字节,01,02,03,04,05,06,07,08
            byte b = unsafe.getByte(a);
            //通过getByte方法获取刚才存放的long,取第一个字节
            //如果是大端,long类型顺序存放—》01,02,03,04,05,06,07,08  ,取第一位便是0x01
            //如果是小端,long类型顺序存放—》08,07,06,05,04,03,02,01  ,取第一位便是0x08
            switch (b) {
                case 0x01:
                    System.out.println("大端");
                    break;
                case 0x08:
                    System.out.println("小端");
                    break;
                default:
                    assert false;
            }
        } catch (Exception e) {

        }

    }
}

执行结果:

小端