大端和小端

内存地址是连续有序的。计算机存储数据与内存寻址是以字节为单位的。

当存储char,byte类型时,需要一个字节的内存,存储与读取无异议。

但当存储short,int等类型,需要多个字节内存空间,怎么存储呢?低位置的第一个字节,是存储数据的低位(小端模式),还是存储数据的高位(大端模式)呢。

例如一个16bit的short型,值为0x1122那么0x11为数据的高位,0x22为数据的低位。其在内存中的地址为0x0010(即占用0x0010,0x0011两个字节),对于大端模式,就将0x11(数据高位)放在低地址中,即0x0010中,0x22(数据低位)放在高地址中,即0x0011中。小端模式,刚好相反。

如果把内存看作是从右向左的,地址依次增大;数据左边为高位,右边为低位,也是从右向左依次增大,如果存储顺序一致,则是小端;相反,则是大端。

public class _01_判断大端小端 {
    public static void main(String[] args) {

        if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) {
            System.out.println("BIG_ENDIAN");
        } else {
            System.out.println("LITTLE_ENDIAN");
        }

        //误解:
        int i = 1;
        byte b = (byte)i;// 并不能判断大小端,因为向下的类型转换时,保留的是a值的低字节部分,而不是内存中数据的低地址字节部分
        System.out.println(b);
        if(b == 1)
            System.out.println("LITTLE_ENDIAN");
        else
            System.out.println("BIG_ENDIAN");

        System.out.println(i&0xff);
    }
}


你可能感兴趣的:(大端和小端)