数值取值范围引发的问题:计算机中的负数
0 . 为什么要写本文:
重新认真打基础的时候,发现byte的取值范围是:-128~127,为了弄清楚为什么最小的数是-128而不是-127,顺便写下来吧,之前了解过又忘
记了。
1 . 什么是源码,反码,补码:
二进制存储在计算机中,最高位是符号位。0表示正数,1表示负数。
原码:将一个整数,转换成二进制,就是其原码。
例如:单字节的5的原码为:0000 0101;-5的原码为1000 0101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。
例如:单字节的5的反码为:0000 0101;-5的反码为1111 1010。
补码:正数的补码就是其原码;负数的补码就是其反码+1。
例如:单字节的5的补码为:0000 0101;-5的补码为1111 1011。
2 . 为什么负数要用补码表示:
从软件角度出发,需要表示类型范围:
byte类型,能表示的数值范围是-128~127,一共256个数值。正数的最大值是127,源码为:0111 1111,因为这个是8位数的最大能表示的数了。
如果用源码表示最小的数那就是1111 1111 最大只能表示到-127。那么-127的反码呢1000 0000。都表示不了-128,-127的补码是:1000 0001,再减去1的话就是-128了:1000 0000。
最终,反码1000 0000表示的是:-128。
从硬件角度出发:
1)
3 . 数据类型的强制转换:
一个short类型的128转换成byte类型的话,会发生什么情况呢?
short类型的128源码为:0000 0000 1000 0000 ,强制转换为byte类型的话
byte b = (byte)128; System.out.println("byte is :"+b);
那么就会丢失掉前面的8位,变成1000 0000 ,这时候,符号位是1那么这个表示的是一个负数的补码,这个负数就是:-128了,输出的也是"byte is -128"

浙公网安备 33010602011771号