引言
大家都知道占2个字节的int类型,取值范围是-128~127;那么这个-128究竟是怎么来的呢?
正文
以java
语言中的byte
类型为例,byte
占用1个字节byte
,共8个bit
;也就是8个0或者1来表示正数;在计算机系统中规定第一位表示正负;所以有如下现象:
0000 0000 ~ 0111 1111 表示正数(十进制:+0到+127)
1000 0000 ~ 1111 1111 表示负数(十进制:-0到-127)
由于计算机采取二进制补码来表示负数,所以有
(原码取反+1得到补码(注意:取反不包括符号位))
1000 0000 的补码为 0000 0000 ;
而+0用原码表示也是 0000 0000;
也就是说,+0和-0在二进制系统中存储的编码时一样的
因为我们知道,8位二进制可以表示28个编码,但是当用补码表示负值时,这8个bit就只能表示28-1个编码了(换句话说有一个编码:1000 0000,他的补码和另外一个编码重复了。。。)
由于任何一个原码转变为补码时都不会变成1000 0000;
所以,人为规定1000 0000这个补码编码对应的十进制数**-128**
综上,补码系统中,java
的int
类型表示的取值范围为:-128~127
(为了找这个人为,肝掉两小时)
上述内容如有不妥,看官一定私信或评论指正啊!
参考文章:
https://www.cnblogs.com/hxh88/p/9284049.html
https://blog.csdn.net/linux12121/article/details/51236654
https://blog.csdn.net/cyhleo/article/details/6849704
相关背景知识
- 负数在计算机中是以补码表示的
- 补码就是:原码取反+1;
- 反码:就是0变1;1变0;
- 模:指一个计量系统的计数范围;例如时钟的模是12,超过12就会溢出;12这个值也在计量器上显示不出来,计量器只能显示模的余数(0,1,2,3。。。。11)
- 计算机减法系统比较复杂,而加法器比较容易实现,所以如果可以用加法替代减法的话,然后使用同一种电路就可以实现整数的加减法运算了。
- 例如在4位计算机中,模是16;5-3=2的结果和5+16-3=16+2=2的结果一样;把二进制负数用补码表示也是为了算减法时直接+这个负数就可以了
疑问:人为规定是如何实现的 ?