您的位置:首页 > 其它

原码补码反码——复习

2017-06-28 15:15 375 查看

基本概念

原码

指二进制数据,常见文件中的010101010…..

原码:可直观反映出数据的大小。

反码

在原码的基础上:符号位不变,其他位取反

补码

在反码的基础上符号位不变,和1做加法

说明: 原码 一般是机器码(同样的原码,在有符号和无符号时表示的10进制数不一样)

原:00101011 反码:01010100 补码:0 1010101

*

byte 转 成int 类型翻译的值 是改byte字节的对应的补码

*

byte 原码是:1111-1111 对应的反码:1000-0000 对应的补码:1000 0001 补码对应的10进制值(也就是int值)是-1

Java中的体现

数值一般用补码表示

1 int = 4 byte

int -> byte ->int

byte b = 0;
//       16 进制 ff = 10 进制255
for ( int i = 0; i <= 0xff; ++i ) {
b = (byte)i;// 去int的最低4位
System.out.print(" "+i+":"+b+", ");
}


为什么会出现 179:-77 这样的结果?

int 类型的 179 对应的原码是:[00000000..00000]10110011

转换成 byte 类型对应的原码是:10110011

将 byte转成int 类型的时候需要先将byte 换算成相应的数值,这里需要求其补码: [11001100]反 ,[11001101]补码

11001101 这个补码对应的有符号值是 - 77 这也是为什么会是这个结果

将正数425 进行int -> byte->int转换,结果是-87

//      b = (byte) 425;
//      1 1010 1001(u 169) 原码
//      反:1101 0110 补:11010111
//      System.out.println("byte"+b); //(-87)1101 0111


Java 中读取二进制文件遇到的问题

字节byte为 1111 1111 在转为Int 类型的时候值会变成 -1

11111111 11111111 11111111 11111111 (=0xFF)

00000000 00000000 00000000 11111111 (byte)

&

0xff

InputStreamReader.java

public synchronized int read() throws IOException {
if (pos >= count) {
fill();
if (pos >= count)
return -1;
}
return getBufIfOpen()[pos++] & 0xff;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: