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

article/2025/9/24 21:52:22

Java整型的字节序是()

A.Little-Endian(小端)

B.Big-Endian(大端)

C.由运行程序的CPU决定

D.由编译程序的CPU决定

对于大小端,我估计肯定有很多开发人员跟我一样都没听过

由于Java是跨平台的,JVM为我们屏蔽了大量的底层细节和复杂性,导致在平时的时候根本不会接触到。以下是我通过大量咨询,查找整理的结果。

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

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

f3014455115364a70e0b43064aa1f76c.png

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

cdf695597c86070fc83c1f8c794ec7c4.png

在计算机中既可以是大端存储,也可以小端存储,跟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默认使用了大端


http://chatgpt.dhexx.cn/article/ugdeguO2.shtml

相关文章

存储模型:大端和小端

前言: 计算机操作系统中存储信息都是以字节为单位,每个地址单元对应 1 个字节。 1 个字节为 8 bits,对于某些32 位处理器而言,char类型数据占用 1 个字节的空间,short 占用2个字节,int 占用4个字节。而这…

操作系统之大端小端

1. 什么是大端,什么是小端: 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中; 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地…

二进制、16进制、大端小端

16进制的使用 在开发过程中,写文件是常有的事,如果写的内容是文本,随便用一个记事本软件打开即可查看内容是否正确,如果写的是音频文件,就要用音频播放器来查看,如果是视频文件,就要用视频播放…

网络传输大端序_大端、小端与网络字节序

大端(Big-Endian),小端(Little-Endian)以及网络字节序的概念在编程中经常会遇到。网络字节序(Network Byte Order)一般是指大端(Big-Endian,对大部分网络传输协议而言)传输,大端小端的概念是面向多字节数据类型的存储方式定义的,小…

677-大端模式和小端模式详解

1、大端和小端核心是什么? 大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式,总结如下: 大端模式:低地址对应高字节 小端模式:低地址对应低字节 不管是大端还是小端模式,我们在读取和存…

大端小端详解

转载:大端小端详解 1>"大端" "小端"的来源 关于大端小端名词的由来,网传有一个有趣的故事,可以追溯到1726年的Jonathan Swift的《格列佛游记》,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端…

大端序发送数据

需要发送数字 151510 大端序发送就是 :00 02 4F D6 string smallData textBox1.Text;//小端数据if (smallData ""){MessageBox.Show("请输入初始里程", "错误",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);textBox1.Text …

c语言之大端小端问题

这就是字节序问题:数据在计算机内存中存储或者网络传输时各字节的存储顺序 通常来说就分为两种情况: 一种是大端(big-endian):高字节(高位)存放在低地址,低字节(低位)存在高地址 另外一种小端(little-endian):高位存放…

数据存储:大端小端

文章目录 问题起源大端小端大端小端优劣符合人类阅读方式数据类型转换符号位的识别 参考资料 曾经辨析和了解过大端小端,但是到了实际应用中还是比较模糊。整理一些资料文章,在此记录。 问题起源 在计算机的使用以及现代很多的嵌入式设备中,…

大端与小端

一.大小端介绍 “大端”和“小端”表示多字节值的哪一端存储在该值的起始地址处。小端存储在起始地址处,即是小短字节序;大端存储在起始地址处,即是大端字节序。 大端存储模式:数据的低位保存在内存中的高地址中,数据…

大端和小端的含义及判断代码

1、概述 在计算机系统中,数据都是以字节进行存储的,每个地址单元对应一个字节,每个字节都是8位(bit)。但是C除了char和bool之外,还有其它多字节类型。怎样存储多字节的数据就分为了大端和小端。字节序只和…

C语言基础 —大端和小端

大端和小端 1、什么是大端和小端2、为什么会有大端和小端3、怎样判断是大端还是小端 1、什么是大端和小端 大端模式:就是 高位字节 存放在内存的 低地址端,低位字节 存放在内存的 高地址端 小端模式:就是 低字节存 放在内存的 低地址端&…

大端和小端的区别和判断

1.概念 大端模式(big endian):数据的高位字节保存在内存的低地址中,而低位字节保存在内存的高地址中。 小端模式(little endian):数据的高位字节保存在内存的高地址中,而低位字节保存在内存的低地址中。 问:什么是高…

什么是大端和小端

大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在低地址中; 小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在高地址中。 …

大端、小端的前世今生

什么是大端、小端? BigEndian(大端):低字节在高内存地址 LittleEndian(小端):低字节在低内存地址 所谓大端小端,也就是看低字节在高内存地址还是低内存地址,也就是看低字节在前还是高字节在前,低字节在前…

数据存储:小端模式和大端模式——终于搞明白了!!!

首先要记住:读数据永远是从低地址开始的!!! 正文开始 什么是低地址、高地址? 地址编号小的是低地址,地址编号大的是高地址 什么是数据的低位、高位? 小端模式 数据的低位放在低地址空间&am…

室内定位技术(三)——自有定位技术

我们正在使用的技术是以wifi信号强度正态分布为核心,结合神经网络原理的一套完整算法,并对wifi信号的正态分布情况作了很多的优化工作。 以下是在两组wifi信号强度正态分布研究的实例图: 四条不同颜色的线分别代表不同的ap信号强度的正态分布…

室内定位浅析

这一星期都在弄室内定位的事情,关于室内定位。需求就是两个终端之间,能够快速地通过室内定位做出路线规划,进行导航。 这个精确的室内定位路线规划得益于WIFI的精确部署。 先开看看这个WiFi的理论部署模型。 等边三角形的三个顶点作为三个无…

物联网之室内定位

摘要:室内定位正处于百家争鸣、技术爆发的阶段,尤其近年随着UWB、Wi-Fi以及5G等通信技术的广泛应用。 1、定位需求 物联网时代,位置服务已成为人们工作生活必不可少的服务之一,网约车、外卖、导航等都依赖定位服务。这些最常用的…

室内定位关键技术(indoor location)

一、Wi-Fi定位 Wi-Fi定位是目前相对成熟且应用广泛的定位技术,定位方法是基于信号强度的传播模型法和指纹识别法。信号强度的传播模型法,是指使用当前环境下假设的某种信道衰落模型,根据其数学关系估计终端与已知位置 AP 间的距离&#xff0c…