内存地址是连续有序的。计算机存储数据与内存寻址是以字节为单位的。java
当存储byte类型时,须要一个字节的内存,存储与读取无异议。编码
但当存储char(java 使用uniconde编码,1个字符占两个字节)、short,int等类型,须要多个字节内存空间,怎么存储呢?低位置的第一个字节,是存储数据的低位(小端模式),仍是存储数据的高位(大端模式)呢。spa
例如一个16bit的short型,值为0x1122,那么0x11为数据的高位,0x22为数据的低位。其在内存中的地址为0x0010(即占用0x0010,0x0011两个字节),对于大端模式,就将0x11(数据高位)放在低地址中,即0x0010中,0x22(数据低位)放在高地址中,即0x0011中。小端模式,恰好相反。code
若是把内存看做是从右向左的,地址依次增大;数据左边为高位,右边为低位,也是从右向左依次增大,若是存储顺序一致,则是小端;相反,则是大端。内存
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); } }