Integer源码中的MIN_VALUE = 0x80000000和MAX_VALUE = 0x7fffffff的分析

1.计算机的常识

(1)总所周知,计算机最底层存储的二进制数值是以补码形式存在的,这是了实现两个数的减法而设计的。

(2)举个小例子去理解补码,两个四位二进制之间的加减运算

  0010(2) + 0001(1) = 0011(3)

  0010(2) - 0001(1) = 0001(1)(现实中的运算)

    如果是这样运算时可以不用补码的,但是事实上计算机没有减法运算器,或者说减法运算器太复杂了,总而言之就是没有减法运算器。

  那么,减法只能用一个负数来代替了。于是有了符号位,第一位便是符号位。

  下面有几种概念:   

原码是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。

反码:正数的反码还是等于原码负数的反码就是他的原码除符号位外,按位取反。

补码:正数的补码等于他的原码负数的补码等于反码+1。(这只是一种算补码的方式,多数书对于补码就是这句话)

 

 

 

 在这里我们可以不用看反码,直接看补码。

2.Integer源码中的MIN_VALUE = 0x80000000和MAX_VALUE = 0x7fffffff的分析

   Integer是Java中的包装类,占4字节。一共4*8=32位,由8个16进制组成。如上图所示,最小值为-8即1000,最大值为0111即0111。然后,最小值在1000全部补0即为80000000,最大值在0111后面全部补1即为7fffffff。

  1000 是 -8 -2^3 那么 10000 -2^4 -16 100..000 -2^31 2147483648,补码主要是负数难理解,正数和原码差不多,补码本来也是计算机为了解决负数(减法)的存在。

 

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

觉得不错的可以点一下右边的推荐哟

posted @   linzm14  阅读(714)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示