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++中的定义:
①数值型——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为单位的
文档里是这么解释的:
将指定的字节写入此输出流。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为单位的
相关文章推荐
- JDK的OutputStream为什么方法write(int b)的入参类型是int呢?
- Java中字节流和字符流的read()方法为什么返回的值是int类型
- Java中字节流和字符流的read()方法为什么返回的值是int类型
- 利用write(int)方法写入一个int型的数据为什么看见的却不是整形的数据?
- Java中字节流和字符流的read()方法为什么返回的值是int类型
- 为什么read()方法返回的是int类型而不是byte
- Sturts 1.3 bean write int类型输出异常解决方法
- 转载关于int与string类型转换的两种方法
- Mysql数据库中把varchar类型转化为int类型的方法
- 为什么要用大写的那些类型修饰符?如INT与int、BOOL与bool、UINT等...
- int类型转换成字符串和字符串转换成int类型以及在MFC静态文本框显示数字的方式方法
- /usr/include/linux/netfilter.h: 错误:‘in’的类型不完全,netfilter_ipv4.h:53: ‘INT_MIN’‘INT_MAX’未声明解决方法
- js把字符串转换成int类型的方法总结
- struts的bean:write标签无法输出int和bigdecimal数据的解决方法
- 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int---->解决方法
- JAVA为什么有时候除法计算结果本来应该是小数。但是得到整数int类型
- 浅述int与string类型转换的两种方法
- 使用MyBatis查询int类型字段,返回NULL值时报异常的解决方法
- 1 String转换为int类型的方法
- C#中ASCLL码转int类型解决方法