In java, range of byte : -128 ----- 127(for SCJP)

来源:互联网 发布:锁屏后仍能录像的软件 编辑:程序博客网 时间:2024/05/17 23:57

      byte b = 127;
      b += 1;
      System.out.println(b);
根据前面的介绍,byte类型的取值区间是-128~127,由于复合赋值运算符不改变结果的类型,则导致结果是-128,而不是128。

 

原因如下:
byte类型值127的机器数是01111111,0表示正数,后续的数值表示127
该数值加1后,得到的数值是10000000,二进制加法
而10000000在byte类型中恰好是-128的机器数表示形式
其它类型的符合运算符也可能存在类似的情况,使用时需要注意。

===========================================================
Question :
byte a=100;
byte b=120;
byte c=(byte)(a+b);
System.out.println(c);

相加超出byte范围 怎么出来1个负的数???

Answer :
1个byte是8个bit 也就可以表示256个数
java中用它来表示-128~127 这一整数段

二进制数 01111111表示127
它的下一顺序位10000000 直接对应的是128 但因为需要它表示的是有符号数
所以10000000就用来表示了-128 转换方式是反码+1(二进制) 同理对应129的10000001
就用来表示有符号数-127了

上面的程序中的a+b= 220 即 11011100 经反码+1后 =>00100100 是十进制的36
所以最后显示结果就是-36
-------------------------------------------------------
另外,byte 在内存里只占一个字节,即八位。a + b = 220,超出了范围。
执行byte c=(byte)(a+b); 时(a+b)自动转换为int型,int 型是四个字节的,三十二位,应为:
0000 0000 0000 0000 0000 0000 1101 1100
强制转换为byte型时,在内存中只保存到四个字节中的一个字节,即是保存了八位,为:
1101 1100
计算机中是用补码来表示,所以输出的是-36。

本来一个byte,8个比特,有256种状态,正好-128到+127是256个数,一个状态也没浪费。

原创粉丝点击