原码补码反码——复习

来源:互联网 发布:淘宝类目搜索排名 编辑:程序博客网 时间:2024/05/19 19:57

基本概念

  1. 原码

指二进制数据,常见文件中的010101010…..
原码:可直观反映出数据的大小。

  1. 反码

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

  1. 补码

在反码的基础上符号位不变,和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 这样的结果?

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

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

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

  4. 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;    }
原创粉丝点击