在java中, byte的取值范围:2的7次方--- 2的7次方减去1;既然byte的最高位为符号位,为什么取值范围还是负的2的7次方到2的7次方减去1而不是2的6次方到2的六次方减一呢?还有可以告知short int long 的取值范围吗?因为我看资料写的很乱,不知道到底哪个对。像short的取值范围是2的16次方到2的16次方减一还是2的15次方到2的15次方减一啊?可以再解释一下吗?

解决方案 »

  1.   

    byte 是有8位的,但这个8位呢使用2进制表示的也就是1101 1101之类的
    ,左边第一位是符号位,所以用以表示数值的实际只有7位,然后就可以得到它的范围了,是(-)111 1111->(+)111 1111,即
    -2的6次方加上-2的5次方。直到-2的0次方,也就是
    -64+(-32)+(-16)++(-1)=-127,
    同理得+127,
    那为什么是-128呢。因为还有(1)000 0000,即(-)000 0000=-128
      

  2.   

    计算机对有符号数(包括浮点数)的表示有三种方法:原码、反码和补码而Java使用补码来表示有符号的二进制数。在补码表示中,最高位为符号位 ,正数的符号位为 0,负数为1。负数的补码是该数绝对值的原码按位取反 ,然后对整个数加1 byte是1个字节,也就是8位 最大的应该是0111 1111,因为第一位是符号位,0表示正数,0111 1111即127 最小的应该是1000 0000,同理,表示负数最小的(1111 1111是最大的负数-1) 1000 0000按照上面补码的解释为先减一,得到0111 1111,然后按位取反得到1000 0000,该结果为欲求负数的绝对值,所以结果是-128(和补码概念反着来求出该负数)
      

  3.   

    在JAVA中short 2字节 (16位)int 4字节(32位) long 8字节(64位)
      

  4.   

    byte 是有8位的,但这个8位呢使用2进制表示的也就是1101 1101之类的
    ,左边第一位是符号位,所以用以表示数值的实际只有7位,然后就可以得到它的范围了,是(-)111 1111->(+)111 1111,即
    -2的6次方加上-2的5次方。直到-2的0次方,也就是
    -64+(-32)+(-16)++(-1)=-127,
    同理得+127,
    那为什么是-128呢。因为还有(1)000 0000,即(-)000 0000=-128
      

  5.   

    我写了一篇blog,比较深入地说明了
    http://blog.csdn.net/stonecao/archive/2011/03/22/6269203.aspx
    有不明白的欢迎留言请教