java 负数存储结构_负数在java中的存储和读取过程 | 学步园

问题描述:

将-5存储在文本文件中,再读取出来显示到控制台;

预备知识:

1.在java中使用补码处理数字,而且byte(8)的数字在扩展成int(32)类型的时候,正数填充0,负数填充1;

2.负数的转变过程

2071898.html

000f3242b28afbad2eb69a497ec6b4c0.png

2071898.html正数的原码,反码,补码,都一样;

解决步骤:

1.  -5(5)在byte类型中的表示是1000 0011(0000 0011) 当它扩展成int的时候会变成 11111111 11111111 11111111 11111011(00000000 00000000 00000000  00000011);

2.

byte binaryInt = -5;

Path path = Paths.get("..");

try {

OutputStream out = new BufferedOutputStream(Files.newOutputStream(path,

CREATE));

out.write(binaryInt);

out.flush();

out.close();

BufferedInputStream input = new BufferedInputStream(Files.newInputStream(path));

int i= input.read();

input.close();

System.out.println(i);

} catch (IOException ex) {

}

输出为 251

3.原因

第一步是看写入操作

jdk BufferedOutputStream write()源码

public synchronized void write(int b) throws IOException {

if (count >= buf.length) {

flushBuffer();

}

buf[count++] = (byte)b;

}

在写入操作的时候只是把11111111 11111111 11111111 11111011的后8位写入了文件中,这也就解释了文件中为什么是0xFB

2071898.html

2071898.html的原因了;

然后是读取操作

jdk InputStream read() 源码

public synchronized int read() throws IOException {

if (pos >= count) {

fill();

if (pos >= count)

return -1;

}

return getBufIfOpen()[pos++] & 0xff;

}

java中位运算会先将参与运算的数据类型转换成int,

2071898.html

证明了这一点;所以getBufIfOpen()[pos++]扩展成int数据类型时候是11111111 11111111 11111111 11111011,getBufIfOpen()[pos++] & 0xff就变成了11111111 11111111 11111111 11111011&00000000 00000000 00000000 11111111最后是251;

4.解决办法

int i= input.read()-256;就可以得到原值了;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值