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语言中没有(C/C++中的定义:typedef unsigned char BYTE);
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。

另外收录胡老师的见解:
typecast问题,高低位问题,符号问题,32位对齐问题
你还需要知道为什么用32bit不是64bit的bigint,因为java允许64bit非原子操作
32位对齐是编译原理,因为主板总线是32位传输数据,所以所有低于32位的数据在传输时都要按照32位传输,因此内存中也是保存32位,地址都是以4为单位的

相关参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值