Java的byte类型取值范围为什么是负128到正127呢

时间:2024-10-03 10:46:04

Java的byte类型取值范围是-128~127为什么负数是128正数到127呢

概念:java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。

在了解byte取值范围之前,我们需要先了解原码、反码、补码

  1. 正数的原码、反码、补码是一样的 (都是其本身)
  2. 负数的反码是对其原码 逐位取反,但符号位除外 ;即(符号位不变,其余位取反即1变成0,0变成1 )
  3. 负数的补码是在其反码的末位加1。

栗子:

+21,其二进制表示形式是00010101,则其补码同样为00010101 
-21,按照概念其绝对值为00010101,各位取反为11101010,再加111101011,即-21的二进制表示形式为11101011
  • 1
  • 2
  • byte为一字节8位,最高位是符号位(0正1负),剩余七位为数值位,即最大值是0111 1111,因正数的补码是其本身,即此正数为0111 1111,十进制表示形式为127。

  • 既然有了127,那么就知道了-127,-127的原码就是1111 1111,负数的补码是原码取反(符号位不取反)加1;-127的原码是1111 1111,反码是 1000 0000 ,补码是 1000 0001。

  • 下面来解释-128是怎么来的:

​ -0的原码是1000 0000,反码是 1111 1111,补码是 10000 0000 ,因为byte只识别8位字节,

​ 所以补码是 0000 0000 。+0的原码是 0000 0000 ,反码补码都是其本身,还是0000 0000,我们日常中没 有-0,所以规定0在计算机中国表示为 0000 0000。

​ 以0开头的补码已经全部使用,因为正数原码、补码都是一样的,所以 0000 0001 到 01111 1111补码已经全部占用。

  • 以-1开头的原码:

    原码 -11000 0001-1271111 1111
    
    反码    是  1111 1110 ,       是 1000 0000
    
    补码    是  1111 1111 ,       是 1000 0001
        
    即补码 1111 1111 到补码 1000 0001 表示 -1-127   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

如图:
在这里插入图片描述

此时还剩一串补码1000 0000,就把这串码表示为-128( -128只有补码10000000,没有反码和原码,具体为何要把1000 0000表示为-128。
不知道这样解释是否合理,不赞同的欢迎讨论哈! )