负数在计算机中是怎么存储的?

负整数的二进制使用最高位表示符号位,用1表示负数,用0表示正数。

哪个是最高位呢?整数有4种类型byte、short、int、long,分别占1、2、4、8个字节,即分别占8、16、32、64位,每种类型的符号位都是其最左边的一位。

负数表示不是简单地将最高位变为1,比如:

  • byte a=-1, 如果只是将最高位变为1,二进制应该是1000 0001,但实际上,它应该是1111 1111。
  • byte a=-127,如果只是将最高位变为1,二进制应该是1111 1111, 但实际上,它却应该是1000 0001。

负数在计算机中使用补码表示法,即对应的正数的补码。

补码表示法:在原码表示的基础上取反然后加1,比如:

  • byte a=-1,其正数1的原码0000 0001,取反1111 1110,加一1111 1111。
  • byte a=-2,其正数1的原码0000 0010,取反1111 1101,加一1111 1110。

给定一个负数的二进制表示,要想知道它的十进制值,可以采用相同的补码运算。比如:

10010010,首先取反,变为01101101,然后加1,结果为01101110,它的十进制值为110,所以原值就是-110。

我们讲一下原理:

直觉上,应该是其正数的原码先减1,然后再取反,但计算机只能做加法,而补码的一个良好特性就是,对负数的补码表示做补码运算就可以得到其对应正数的原码,正如十进制运算中负负得正一样。

负整数为什么要采用这种奇怪的表示形式呢?原因是,只有这种形式,计算机才能实现正确的加减法。

对于byte类型,正数最大表示是01111111,即127,负数最小表示(绝对值最大)是10000000,即-128,表示范围就是-128~127。其他类型的整数也类似,负数能多表示一个数。

计算机其实只能做加法,1-1其实是1+(-1)。

如果用原码表示,计算结果是不对的,比如byte a = 1, byte b = -1,a+b的结果是-2:

         1 -> 00000001
        -1 -> 10000001
        + ------------------
        -2 -> 10000010

如果是补码表示,结果是正确的,结果是0:

        1   -> 00000001
        -1  -> 11111111
        + ------------------
        0   -> 00000000

看上去可能比较奇怪和难以理解,但这种表示其实是非常严谨和正确的。

#面试##大厂##成长##数据的本质##Java原理#
27届毕业生-Java知识专辑 文章被收录于专栏

知其然知其所以然,只有掌握了底层原理,借助第一性原理,才可以在日常开发和项目中运用自如,潇洒走江湖。 专为27届毕业生准备,托起您的就业梦。 该专辑会不定时更新,建议27届同学订阅,入职后扎实的基本功可以帮您争取更好的机会和项目。

全部评论

相关推荐

白火同学:先说结论,对于一份实习简历来说,整体还是挺不错的,技术深度和广度都到位,找到一份中小厂的实习没啥问题。 再说说能优化的点吧。 1、量化结果,项目中很多工作量化一下结果给面试官的感受会更直观一些,也能体现你对应用该项技术的理解(在众多技术为什么要用它,运行性能或者说开发效率往往是一大考虑指标;而不是说大家做这种功能都用它,所以我用它)。 2、突出亮点,项目中可以从“工作职责”择一些“个人亮点”另写一块,优先去写开发过程中遇到的xx问题,使用xx技术达到xx效果,针对性去写一些疑杂难的功能,能带出你个人思考和解决的过程。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务