Ⅰ:原码、反码、补码
得先了解原码反码补码并掌握它们的计算,我们才能进一步的分析byte的取值范围。前辈们研究出用加法电路实现加法运算后,减法运算就没有专门去设计减法电路,而是设计了补码,利用加法电路来将减法运算变为加法运算。正数的原码反码补码都是其本身
负数的反码在其原码的基础上,符号位不变,其余各位取反。负数的补码在其反码的基础上加1
比如1的原码为0000 0001,反码为0000 0001,补码为0000 0001
比如-1的原码为1000 0001,反码为1111 1110,补码为11111111
Ⅱ:byte的取值范围为什么是-128~127?
byte是八位(1字节=8bit),如果为无符号位表示的话,最大是1111 1111即255。当用符号位表示时,这8位分为符号位(最高位)和数值位(剩余七位),符号位0表示正数,1表示负数。则正数最高为0111 1111即为127.难于理解的在于为什么是-128? 按理说负数最高位1111 1111即为-127,为什么是-128呢??
前面说了byte是8位最大为255,有255个坑,127+127只有254个坑,岂不少了1个坑。如果我们假设现在byte不是占用8位,而是9位,最高位是符号位。那么-128就能够是1 1000 0000,其补码也是1 1000 0000,是不是很巧合?可以简单认为计算机规定了1000 0000就是-128,以此来填坑,这是人为设计的,这样从-128~127的反码首尾相连,形成了一个闭环,就像时钟一样。
再来看看其他的基本数据类型,int是4个字节存储32位,取值范围-2^31到2^31-1;long用8个字节存储64位,取值范围是-2^63到2^63-1,可见跟byte的方式是一致的,都是负数多填了个坑