Java整型的字节序是()
A.Little-Endian(小端)
B.Big-Endian(大端)
C.由运行程序的CPU决定
D.由编译程序的CPU决定

对于大小端,我估计肯定有很多开发人员跟我一样都没听过
由于Java是跨平台的,JVM为我们屏蔽了大量的底层细节和复杂性,导致在平时的时候根本不会接触到。以下是我通过大量咨询,查找整理的结果。

字节序:指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序,有大端小端两种方式

大端:指高位字节存放在内存的低地址端,低位字节存放在内存的高地址端。十六进制整数0x01020304在内存中存储方式,由于一个整型在内存中占4个字节,因此被划分成4份分别存储在连续的内存地址位中

小端:指低位字节放在内存的低地址端,高位字节放在内存的高地址端。同样0x01020304在内存中的存储方式为

在计算机中既可以是大端存储,也可以小端存储,跟CPU架构有关,IA架构(Intel、AMD)的CPU中是Little-Endian,而PowerPC 、SPARC和Motorola处理器是Big-Endian

基于Java8,在Java中提供了一个api可以获取CPU使用的字节序:

ByteOrder byteOrder = ByteOrder.nativeOrder();
//LITTLE_ENDIAN,CPU是Intel的
System.out.println(byteOrder);

通过查看ByteOrder.nativeOrder() 源码,其最后调用了Bits.byteOrder()

// -- Processor and memory-system properties --
private static final ByteOrder byteOrder;static ByteOrder byteOrder() {if (byteOrder == null)throw new Error("Unknown byte order");return byteOrder;
}/**
* 通过返回0x01,还是0x08来判断CPU使用的是BIG_ENDIAN,还是LITTLE_ENDIAN
**/
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);}
}

对于Java,其实既有使用大端,也有使用小端,对于ByteBuffer,默认使用的Big-Endian(大端),也可以对默认方式进行修改,如下例子

int x = 0x01020304;ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[4]);
byteBuffer.asIntBuffer().put(x);
String before = Arrays.toString(byteBuffer.array());
System.out.println("默认字节序:"+byteBuffer.order().toString() + "," + "内存数据:"+before);byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
byteBuffer.asIntBuffer().put(x);
String after = Arrays.toString(byteBuffer.array());
System.out.println("修改字节序:"+byteBuffer.order().toString()+","+"内存数据:"+after);默认字节序:BIG_ENDIAN,内存数据:[1, 2, 3, 4]
修改字节序:LITTLE_ENDIAN,内存数据:[4, 3, 2, 1]

通过查看ByteBuffer.wrap,其声明了一个HeapByteBuffer

 public static ByteBuffer wrap(byte[] array, int offset, int length)
{try {return new HeapByteBuffer(array, offset, length);} catch (IllegalArgumentException x) {throw new IndexOutOfBoundsException();}
}

所以byteBuffer.asIntBuffer()实际调用了HeapByteBuffer中的方法

public IntBuffer asIntBuffer() {int size = this.remaining() >> 2;int off = offset + position();return (bigEndian? (IntBuffer)(new ByteBufferAsIntBufferB(this,-1,0,size,size,off)): (IntBuffer)(new ByteBufferAsIntBufferL(this,-1,0,size,size,off)));
}

bigEndian表示是否是大端,默认为true,所以后面put的时候实际是往ByteBufferAsIntBufferB大端中存储数据,但也可以调整为使用小端来存储数据,byteBuffer.order(ByteOrder.LITTLE_ENDIAN);

这题的答案是B,但实际却是Java中既能有大端也能有小端,只是Java默认使用了大端

原文链接

Java中的大端和小端相关推荐

  1. 计算机中的大端与小端

    1. 历史故事 <格列佛游记> 2. 概述 2.1 计算中的大端与小端描述的对象是字节,而不是位.同时,我们规定,计算机中的位编号在最右端从0开始,向左递增,对于四个字节32位来说,地址的 ...

  2. java 为什么用大端_Java中的大端和小端

    Java整型的字节序是() A.Little-Endian(小端) B.Big-Endian(大端) C.由运行程序的CPU决定 D.由编译程序的CPU决定 对于大小端,我估计肯定有很多开发人员跟我一 ...

  3. 网络编程中的大端和小端

    将低序字节存储在内存的起始地址,这称为小端字节序. 将高序字节存储在内存的起始地址,这称为大端字节序. 检查大小端字节序的简单代码如下: int main(int argc, char **argv) ...

  4. Java中大端、小端和>>运算符

    下面对java中的大端.小端和>>运算符进行整理记录. 字节序,指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序,有大端和小端两种方式: 大端:指高位字节存放在内存的低地址端, ...

  5. mysql是大端小端_大端和小端 - HackerVirus - 博客园

    在计算机中是以字节为单位,每个地址对应一个字节,一个字节8bit.在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过siz ...

  6. 大端和小端传输字节序

    大端和小端 在计算机中是以字节为单位,每一个地址对应一个字节,一个字节8bit.在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定, ...

  7. 大端与小端:显示、存储和读取

    在文章<大端与小端>中,简单介绍了什么是大端与小端.就像打碎鸡蛋一样,你可以从大的那头打,也可以从小的那头打,但是鸡蛋还是那个鸡蛋.数据也是一样,你要么从高位存储或传输,要么从低位存储或传 ...

  8. 整数中内存中的保存方式:大端、小端

    一个数在计算机内存中的保存方式是大端法表示还是小端法表示? 首先C++当中并没有规定我们这个内存中,整数在内存中是采用大端法还是小端法表示.所以在编写程序的时候这一点并不是很重要. 但是如果编写一个程 ...

  9. 大端和小端的判断及转换

    当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-en ...

最新文章

  1. Android Broadcast Receiver
  2. 霍夫变换MATLAB怎么实现,做过Matlab关于霍夫变换检测圆的高手请进
  3. C++继承时的对象内存位置(一)有成员变量遮蔽时的内存分布
  4. 又一国产开源微内核操作系统上线!源代码已开放下载
  5. HttpClient调用http接口(POST)
  6. 微信小程序开发的游戏《拼图游戏》
  7. [zz]KVM 虚拟机故障排除一例
  8. 软件工程实践总结--个人作业
  9. thinkjs查询mysql_Thinkjs关系数据库学习——查询数据
  10. 不用MindManager打开mmap文件
  11. 桌球小游戏(java)编程
  12. 2022-2028年全球与中国硬盘驱动器存储模块行业深度分析
  13. 学习记录:python糗百爬虫
  14. linux终端清除命令,ubuntu清除命令行记录
  15. 安洵信息渗透工程师面试经验分享
  16. TOC和TOB产品的区别是什么
  17. S3cmd命令行工具使用
  18. 电脑远程桌面连接怎么操作?
  19. easyUI非常迷惑性的bug:分页插件点击下一页和尾页后,发送两次请求,第二次请求回跳转到第一页
  20. unity初学人物走路卡住的问题

热门文章

  1. 百万调音师—Audition 重新混合
  2. Python3 面向对象编程
  3. 企业级数据管理——DAMA数据管理
  4. MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
  5. 嵌入式 Linux 编程
  6. Gunicorn-使用详解
  7. Android 动画
  8. HTML5+CSS3 02(表格、表单标签、语义化,字符实体标签)
  9. BACnet IP通讯方式组网步骤
  10. 离线数仓建设及技术选型