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

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语言中没有;

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

3、为什么不用short? 这个是32位CPU4字节对齐的问题吧,胡老师指正;

4、C语言中整型量和字符量可以通用;

所以Java和c语言文件读写的通信,最佳类型就是int。

另外收录胡老师的见解:

typecast问题,高低位问题,符号问题,32位对齐问题
你还需要知道为什么用32bit不是64bit的bigint,因为java允许64bit非原子操作
32位对齐是编译原理,因为主板总线是32位传输数据,所以所有低于32位的数据在传输时都要按照32位传输,因此内存中也是保存32位,地址都是以4为单位的
CSDN博客稿源:CSDN博客 (源链) | 关于 | 阅读提示

本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 综合编程 » JDK的OutputStream为什么方法write(int b)的入参类型是int呢?

喜欢 (0)or分享给?

专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录