持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
Byte 取值范围探索
计算机中的字节和java中的字节在值的范围上有一些不同,比如一个字节的范围可以表示256个数字,也就是0-255;而在Java中字节也是表示256个数字,在java中的值范围是-128~127,正因为取值范围的不同,才导致在相互转换时容易犯错。这篇文章弄清楚为什么会有不同的表示方式。
字节的范围怎么定义的
1字节(byte)=8位(bit),每个位(bit)只有0和1,所以它能表示的位置依次有:
0000 0000
0000 0001
0000 0011
0000 0010
依次从
00000000 -> 11111111
这种组合可以排列的顺序是2的8次方,也就是 256
有符号数和无符号数
有符号数区分正数和负数,无符号数只有正数。 对于一个字节: 无符号数的取值范围:0-255 有符号数的取值范围:-128-127 它们表示的空间都是 256,有符号数有了负数的延伸。 对计算机而言,它本身不会区分有符号数和无符号数;对编程语言才会区分。
怎么表示负数
计算机的基本都是0和1,用0和1怎么表示负数呢。 在有符号位的情况,用二进制的高位来判断正负,最高位是0则为正数,为1则为负数。 最高位值的是二进制最坐标的一位。
举例
- 1111 1111
有符号: −2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = -1
无符号:2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 255
- 1000 1111
有符号:−2^7 + 0 + 0 + 0 + 2^3 + 2^2 + 2^1 + 2^0 = -113
无符号:2^7 + 0 + 0 + 0 + 2^3 + 2^2 + 2^1 + 2^0 = 143
- 0111 1111
有符号:0 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 =127
无符号: 0 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 =127
通过上诉的数据可以看出:
- 有符号位的时候的,高位为0,那么一定是正数,高位为1一定是负数。
- 有符号位 且 高位为0时,值和有符号位一样。
- 高位不仅仅是符号位,还大程度决定这数的大小
- 有符号位时数据最小 1000 000,最大 0111 1111,所以取值范围在-128 - 127 之间,即java的取值范围