数值取值范围引发的问题:计算机中的负数

0 . 为什么要写本文:
  重新认真打基础的时候,发现byte的取值范围是:-128~127,为了弄清楚为什么最小的数是-128而不是-127,顺便写下来吧,之前了解过又忘
  记了。


1 . 什么是源码,反码,补码:
  二进制存储在计算机中,最高位是符号位。0表示正数,1表示负数。

  原码:将一个整数,转换成二进制,就是其原码。
  例如:单字节的5的原码为:0000 0101;-5的原码为1000 0101。

  反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。
  例如:单字节的5的反码为:0000 0101;-5的反码为1111 1010。


  补码:正数的补码就是其原码;负数的补码就是其反码+1。
  例如:单字节的5的补码为:0000 0101;-5的补码为1111 1011。

 

2 . 为什么负数要用补码表示:
  从软件角度出发,需要表示类型范围:

      byte类型,能表示的数值范围是-128~127,一共256个数值。正数的最大值是127,源码为:0111 1111,因为这个是8位数的最大能表示的数了。

   如果用源码表示最小的数那就是1111 1111 最大只能表示到-127。那么-127的反码呢1000 0000。都表示不了-128,-127的补码是:1000 0001,再减去1的话就是-128了:1000 0000。

   最终,反码1000 0000表示的是:-128。


  从硬件角度出发:

    1)

 

3 . 数据类型的强制转换:

  一个short类型的128转换成byte类型的话,会发生什么情况呢?

  short类型的128源码为:0000 0000 1000 0000 ,强制转换为byte类型的话

    byte b =  (byte)128;
    System.out.println("byte is :"+b);

  那么就会丢失掉前面的8位,变成1000 0000 ,这时候,符号位是1那么这个表示的是一个负数的补码,这个负数就是:-128了,输出的也是"byte is -128"

    

posted @ 2015-03-19 15:35  franck418  阅读(245)  评论(0)    收藏  举报