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

表:基本数据类型及其大小

数据类型

大小(以字节表示)

Byte

1

Char

2

Short

2

Int

4

Long

8

Float

4

Double

8

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

 
左图:大端字节顺序                      右图:小端字节顺序
 

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

字节顺序很少由软件设计者决定;它通常取决于硬件设计。字节顺序的两种类型有时被称 为字节性别,在当今被广泛使用。两种方式都具有自身的优势。Intel 处理器使用小端字节 顺序涉及。摩托罗拉的 CPU 系列、SUN 的 Sparc 工作站,以及 PowerPC 的 CPU 架构都采用 大端字节顺序。

那么Java中如何确定一个当前环境所用的CPU是何种类型的字节顺序呢。我在java.nio.Bits中看见一段代码是这样实现的,很有意思。

static {
long a = unsafe.allocateMemory(8);
try {
unsafe.putLong(a, 0x0102030405060708L);
byte b = unsafe.getByte(a);
switch (b) {
case 0x01: byteOrder = ByteOrder.BIG_ENDIAN; break;
case 0x08: byteOrder = ByteOrder.LITTLE_ENDIAN; break;
default:
assert false;
byteOrder = null;
}
} finally {
unsafe.freeMemory(a);
}
}

原理很简单,就是先分配8个字节Long类型的内存,然后放内存中放入16进制0x0102030405060708L的数据,判断第一个字节是0x01还是0x08,如果是0x01,则说明大端字节顺序,如果是最大的0x08,则是小端字节顺序。

Java中如何判断当前环境是大端字节顺序还是小端字节顺序的更多相关文章

  1. Java中类型判断的几种方式

    1. 前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个 ...

  2. Java中jdk安装与环境变量配置

    Java中jdk安装与环境变量配置 提示:下面是jdk1.7和jdk1.8的百度网盘链接 链接:https://pan.baidu.com/s/1SuHf4KlwpiG1zrf1LLAERQ 提取码: ...

  3. Java 中(静态)变量、(静态)代码块的执行顺序

    Java 中(静态)变量.(静态)代码块的执行顺序 非原创 本文讨论 Java 中(静态)变量.(静态)代码块的执行顺序 首先创建 3 个类 1.Foo 类 public class Foo { pu ...

  4. 大端(big endian)和小端(little endian)

    http://www.cnblogs.com/Romi/archive/2012/01/10/2318551.html 当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的 ...

  5. linux kernel如何处理大端小端字节序

    (转)http://blog.csdn.net/skyflying2012/article/details/43771179 最近在做将kernel由小端处理器(arm)向大端处理器(ppc)的移植的 ...

  6. 大端字节序&小端字节序(网络字节序&主机字节序)

    大端字节序:整数的高位字节存储在内存的低地址处,低字节存储在内存的高地址处. 小端字节序:整数的高位字节存储在内存的高地址处,低字节存储在内存的低地址处. 一般pc大多采用小端字节序,也称为主机字节序 ...

  7. 写一个c程序辨别系统是大端or小端字节序

    字节序有两种表示方法:大端字节序(big ending),小端字节序(little  ending) 看一个unsigned short 数据,它占2个字节,给它赋值0x1234.若采用的大端字节序, ...

  8. Java中如何判断一个日期字符串是否是指定的格式

    判断日期格式是否满足要求 import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date ...

  9. Java中如何判断一个字符是否是字母或数字

    使用Java中Character类的静态方法: Character.isDigit(char c) //判断字符c是否是数字字符,如‘1’,‘2’,是则返回true,否则返回false   Chara ...

随机推荐

  1. Ubuntu完全教程,让你成为Ubuntu高手!

    Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...

  2. Rxjava+Retrofit2+Okhttp3多文件上传(服务器端代码+客户端代码)

    所有代码亲测可用,如有问题,欢迎指正. 首先在ApiService接口文件中新建文件上传接口 public interface ApiService { static final String BAS ...

  3. C语言学习笔记--枚举&结构体

    枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...

  4. Web分析日志分析2

    http://www.docin.com/p-649515490.html http://wenku.baidu.com/link?url=kB-83fbl1Zc3Y6U2BYLj-lKMWShe8Z ...

  5. bit和sbit的区别

    1.bit和sbit都是C51扩展的变量类型. bit和int char之类的差不多,只不过char=8位, bit=1位而已.都是变量,编译器在编译过程中分配地址.除非你指定,否则这个地址是随机的. ...

  6. 用JvisualVM监视远程tomcat

    在tomcat的catcalina.sh 中java_opts 环境变量中添加以下参数: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmx ...

  7. form 转json最佳示例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. javascript对象拷贝

    浅拷贝 浅拷贝函数: function copy(p){ var c = {}; for (var i in p){ c[i] = p[i]; } c.uber = p; return c; } 测试 ...

  9. g++ gcc 的区别

    我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用gcc,链 接用g++,一时也不知哪个说法正确,如果再遇上个ext ...

  10. HDOJ(HDU) 1799 循环多少次?(另类杨辉三角)

    Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次 ...