关于java与intel x86 cpu交换数据时涉及big endian和little endian的问题

hy86 发布于 2013/05/16 17:00
阅读 757
收藏 0

今天看到关于字节序big endian和little endian的问题。通过搜索,知道了:

1.java使用 big endian格式读取字节,这种字节序又称为网络字节序,也就是网络上传输的数据也是这种格式。

2.x86 cpu使用的格式是little endian。

3.如果用C写的程序运行在x86 cpu的机器上,向另一台机器上的java程序发送一个数据时,需要将这个数据的字节序由little endian转换成big endian即网络字节序后再进行传输,否则java程序读到此数据时,将会转换成错误的数据。

现在的问题是,如果在一台x86 cpu的机器上运行一个java程序,此程序与cpu(或者说控制cpu的程序比如汇编?)在数据交换方面是怎样做的呢,毕竟他们使用的字节序是不同的啊,他们之间是不是也要转换,如果转换,是否会影响机器运行效率?

加载中
0
魔力猫
魔力猫

引用来自“阿J小虫”的答案

引用来自“魔力猫”的答案

这都是由JVM虚拟机帮助你处理了,完全帮你屏蔽了底层。性能方面不用担心,很多CPU都有专门的指令进行处理来保证效率。

那么,针对不同的CPU,是不是需要不同的JVM来进行处理和优化,或者让同一款JVM针对市面上的主要的CPU及其他硬件都已经做好了兼容和优化呢?

我对整个计算机的体系大致这样描述,你看对不对:
从上至下,java应用程序-JVM-操作系统-硬件驱动-硬件

所以,java程序在字节序的处理上有JVM帮忙,我们无需担心。但是如果没有中间平台的语言,比如C/C++,就需要针对特定的硬件平台(或者说硬件的驱动)去重新编译一套可执行文件出来,这就是人们通常说它不跨平台的原因。否则,如果在支持big endian的平台上编译出来的C程序直接放到支持little endian的平台去运行,这个C程序会按原平台的big endian格式处理数据,从而会导致出错。

可以这样理解么,请赐教,谢谢!

不同的CPU当然有不同的JVM。IBM和Oracle都有专门针对其自己专有CPU的JDK版本,IBM还有自己专门单独开发的JDK,安腾也有其专有JDK。

这些都是根据不同的系统不同的底层硬件进行了专门处理的。ARM上现在也有专门的嵌入式Java,手机上更有JavaME,都是根据不同的CPU进行了专门优化。

Java做到了字节码跨平台,就是因为底层都由JVM替你处理了,而C就只能源代码跨平台。高低位这种事情一般只有汇编和C才可能去考虑,更高一层的语言有着更加抽象的封装,根本不会去考虑这个。

0
魔力猫
魔力猫
这都是由JVM虚拟机帮助你处理了,完全帮你屏蔽了底层。性能方面不用担心,很多CPU都有专门的指令进行处理来保证效率。
0
Monkey
Monkey
java就不要去想这些和底层平台有关的事情了,绝大多数时候你都可以无视,除非是和嵌入式平台进行点对点,而且是那种非网络的通信,你才需要注意这个。
0
hy86
hy86

引用来自“魔力猫”的答案

这都是由JVM虚拟机帮助你处理了,完全帮你屏蔽了底层。性能方面不用担心,很多CPU都有专门的指令进行处理来保证效率。

那么,针对不同的CPU,是不是需要不同的JVM来进行处理和优化,或者让同一款JVM针对市面上的主要的CPU及其他硬件都已经做好了兼容和优化呢?

我对整个计算机的体系大致这样描述,你看对不对:
从上至下,java应用程序-JVM-操作系统-硬件驱动-硬件

所以,java程序在字节序的处理上有JVM帮忙,我们无需担心。但是如果没有中间平台的语言,比如C/C++,就需要针对特定的硬件平台(或者说硬件的驱动)去重新编译一套可执行文件出来,这就是人们通常说它不跨平台的原因。否则,如果在支持big endian的平台上编译出来的C程序直接放到支持little endian的平台去运行,这个C程序会按原平台的big endian格式处理数据,从而会导致出错。

可以这样理解么,请赐教,谢谢!

0
hy86
hy86

引用来自“魔力猫”的答案

引用来自“阿J小虫”的答案

引用来自“魔力猫”的答案

这都是由JVM虚拟机帮助你处理了,完全帮你屏蔽了底层。性能方面不用担心,很多CPU都有专门的指令进行处理来保证效率。

那么,针对不同的CPU,是不是需要不同的JVM来进行处理和优化,或者让同一款JVM针对市面上的主要的CPU及其他硬件都已经做好了兼容和优化呢?

我对整个计算机的体系大致这样描述,你看对不对:
从上至下,java应用程序-JVM-操作系统-硬件驱动-硬件

所以,java程序在字节序的处理上有JVM帮忙,我们无需担心。但是如果没有中间平台的语言,比如C/C++,就需要针对特定的硬件平台(或者说硬件的驱动)去重新编译一套可执行文件出来,这就是人们通常说它不跨平台的原因。否则,如果在支持big endian的平台上编译出来的C程序直接放到支持little endian的平台去运行,这个C程序会按原平台的big endian格式处理数据,从而会导致出错。

可以这样理解么,请赐教,谢谢!

不同的CPU当然有不同的JVM。IBM和Oracle都有专门针对其自己专有CPU的JDK版本,IBM还有自己专门单独开发的JDK,安腾也有其专有JDK。

这些都是根据不同的系统不同的底层硬件进行了专门处理的。ARM上现在也有专门的嵌入式Java,手机上更有JavaME,都是根据不同的CPU进行了专门优化。

Java做到了字节码跨平台,就是因为底层都由JVM替你处理了,而C就只能源代码跨平台。高低位这种事情一般只有汇编和C才可能去考虑,更高一层的语言有着更加抽象的封装,根本不会去考虑这个。

谢谢
返回顶部
顶部