问题: 为什么 byte的表数范围是 -128 ~ 127
- 答:首先需要引入一些基础概念:
在计算机要想表示一个数字或字符,必须要对数字或字符进行编码,才能写入到计算机的内存或者磁盘中去。因为计算机,只能识别0,1。
举个例子: 存18这个数到磁盘或内存中去,需要经历以下过程。
18 -> 转化为2进制原码 0001 0010
->取反码不变->取补码不变
->最终以0001 0010 存在于计算机中。
计算时也是以这种形式计算。
下面来介绍原码,反码,补码三个概念。
-
原码:直接将一个数值换成二进制数。最高位是符号位(0为正,1为负)。
-
反码:中间格式用于计算补码。 正数不变,负数,最高位不变,其他位0置1,1置0。
-
补码;计算机的数据都是以补码形式进行计算的(规定)。
-
计算时,计算机会将原码转化为补码后进行计算。规则:正数不变,负数,高位不变在反码的基础上加1。
-
总结:正数 原码、反码、补码相同。 负数,高位都不变,反码0置1,1置0,补码在反码基础上加1。
-
举个栗子
-18
原码 1001 0010 (最高位1为符号位表示负号)
反码 1110 1101
补码 1110 1110
解题:
- byte有八位 可以表示 2^8个数。
- 因为是计算机语言,所以要将原码转化为补码表示。
1)正数的范围
正数:原码补码一致不做计算。
以下为正数补码(一共128个,表数范围0到127)
补码 | 数值 | 说明 |
---|---|---|
0 111 1111 | 127 | 正数最大(高位0表示正号) |
… | … | 中间数据 |
0 000 0000 | 0 | 正数最小 (将0也归算到正数中去) |
2)负数的范围
负数原码:
原码 | 数值 | 说明 |
---|---|---|
1 000 0001 -1 | 负数最大(高位1表示负号) | |
… | … | 中间数据 |
1 111 1111 | -127 | 中间值 |
1 000 0000 | -128 | (负数中用-0表示了去表示-128)重点!!! |
- 可以理解为 +0 表示正真的0 ,-0表示 -128
负数反码
反码 | 数值 | 说明 |
---|---|---|
1 111 1110 | -1 | |
… | … | 中间数据 |
1 000 0000 | -127 | |
1 111 1111 | -128 |
负数补码
补码 | 数值 | 说明 |
---|---|---|
1 111 1111 | -1 | |
… | … | 中间数据 |
1 000 0001 | -127 | |
1 000 0000 | -128 |