话不多说,直接进入正题
byte i =127;System.out.println(++i); //很意外的会输出 -128
推测代码执行的结果,分析结果产生的原因。
答:
先看计算机二进制拓展:
在计算机内,定点数有3种表示法:原码、反码和补码
[原码]就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
[反码]表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
[补码]表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
也就是说:
- 正数的补码就是其本身。
- 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
正数:
(p)正数的反码和补码都与原码相同
负数:
(p)负数的反码、补码与原码不同,负数的反码:原码中除去符号位,
其他的数值位取反,0变1,1变0。负数的补码:反码+1
正题:基本数据类型 byte: 1 byte = 1字节 = 8bit (位)
最高位是符号位。
即最大值是01111111(十进制表示形式为127),即此正数为01111111。
那最小值相反就是负数, 负数的符号位是1 , 即 10000000(-128)。
01111111+1 = 10000000
image.png
网友评论