您的位置:首页 > 编程语言 > Java开发

JDK的OutputStream为什么方法write(int b)的入参类型是int呢?

2018-01-02 14:14 295 查看
Java的OutPutStream中有一个方法:write(int b) 
 文档里是这么解释的:
 将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。
 我怎么觉得这个方法有些奇怪呢。参数是一个int类型的整数,为啥不直接是一个字节呢?
今天在群里有小伙伴提到这个问题,知乎上也有人问起这个问题,就这个问题说说我的理解:
这个问题要从JVM虚拟机与底层交互的方面去分析,所以我觉得这是Java语言和c语言类型定义导致的问题;
首先看Java中的函数定义:private native void write(int b, boolean append) throws IOException;注意:是 native 方法C语言中的定义:int fputc(int ch,FILE *fp)我们看到两种语言中都是使用int类型,而不是其它,为什么呢?1、Java中有byte类型,c语言中没有(C/C++中的定义:
typedef
 
unsigned 
char
 
BYTE
);[plain] view plain copy Java中定义了3类8种基本数据类型:  
  ①数值型——byte、short、int、long、float、double  
  ②文本型——char  
  ③逻辑型——boolean  



2、为什么不用char?java中byte到char需要一个强制转换,而 int 不需要;


3、为什么不用short? 这个是32位CPU4字节对齐的问题吧,胡老师指正;4、C语言中整型量和字符量可以通用;
所以Java和c语言文件读写的通信,最佳类型就是int。
另外收录胡老师的见解:[plain] view plain copy typecast问题,高低位问题,符号问题,32位对齐问题  
你还需要知道为什么用32bit不是64bit的bigint,因为java允许64bit非原子操作  
32位对齐是编译原理,因为主板总线是32位传输数据,所以所有低于32位的数据在传输时都要按照32位传输,因此内存中也是保存32位,地址都是以4为单位的  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: