java 中byte一个字节,8位,所能表示的数的范围 是 -128~127,为什么呢?正常来说应该是-127 ~ 127 ,有一位符号位才合理,带着疑问进入复习;
1:计算机中所有操作的是操作数字的补码;
定义:
正数的,原码,反码,补码都是本身,例 4(原码)是 0000 0100 ;4(反码)0000 0100 ; 4(补码)0000 0100
负数的 原码,就是平时自己用二进制直接表示的形式(第一位符号位),例如-4(原码) 是1000 0100,通俗易懂,第一位1代表这是个负数,后面的就代表是个4,合起来就是个-4,这里强调的是 负数的原码 就是我们能直接读出来的这种形式;
负数的反码,原码除符号位取反,用途来求补码的;例如 例如-4(返码) 是1111 1011;
负数的补码:
1:通过上面的反码 ,直接加1;例如 例如-4(补码) 是1111 1100;
2:负数的 补码 就是其正数的 原码 全部取反 加1;例如 4(原码)是 0000 0100 - -》1111 1011 - -》1111 1100;
2:8位在计算机中表示的范围是(补码):
表示的正数 ,0000 0001 ~ 0111 1111 代表 1~(2^7)-1
表示的负数 -127~-1 也就是求其补码,通过上面两个方式
-127(补码)= --》127( 原码)= 0111 1111 -->(全部取反)1000 0000- ->(加1)1000 0001
-1(补码)= --》1( 原码)=0000 0001 -->(全部取反)1111 1110- ->(加1)1111 1111
-127~-1 对应的补码是 1000 0001~1111 1111
再加上谜之尴尬的 0 --》 0000 0000 还有一种表现1000 0000,肯定只取一种,往下看;
合起来就是 1000 0001~0111 1111 也就是正常理解的 -127 ~127
但是 聪明的设计者 发现 还有 1000 0000 没有利用 ,其实就是 -128的 补码,-128 = -127+ (-1)= 1000 0001(补)+1111 1111 (补)= 1,1000 0000多了一位去掉, = 1000 0000(补)转化成 原码 减一再除符号位取反 还是1000 000(原),故用1000 0000来表示-128
所以8位在计算机中 表示的范围是 -128 ~ 127,其他的位数也是这个道理;