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

负整数的二进制使用最高位表示符号位,用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原理#
Java编程原理 文章被收录于专栏

知其然知其所以然,只有了解了底层原理,借助第一性原理,才可以运用自如,成为真大师。 什么是第一性原理? 第一性原理最早由亚里士多德提出,他将其定义为:“事物被已知的第一项前提。” 简单来说,它要求你不要用“类比”去思考(即:因为别人这样做,或者以前这样做,所以我也这样做),克服从众心理(FOMO)和经验偏差,在科技创新、商业决策中找到成本与效率的最优解。

全部评论

相关推荐

02-14 12:40
门头沟学院 Java
程序员花海:1.面试要求必须Java笔试不一定 2.难度对等秋招 远超于日常实习是因为同一批次且转正很多 竞争压力大 3.第一个加点指标,上线了就把接口性能加上去 使用本地缓存这个不算亮点 只是技术选型,要把为什么采用这个和背后的思考写出来而不是单纯堆叠技术没意义 4.八股要一直看 很容易忘记 5.拼团交易这个老问题 堆积技术 另外建议你把奖项合并到教育背景 没必要拆出来放最后
我的简历长这样
点赞 评论 收藏
分享
头像
03-03 13:17
已编辑
苏州大学 Java
面试官真的很有耐心,人非常nice,但问得也是真的很细。面完半小后约HR面。有没有人说说HR面会问啥?【希望能过吧,以前真没想到面个试这么耗精力,这一周感觉都被掏空了】1.请做一下自我介绍。2.你掌握的数据结构有哪些?3.请讲一下一致性哈希的原理和解决的问题。4.请讲一下Ring buffer(环形缓冲区)的相关内容。5.请讲解一下HTTP状态码的相关分类和含义(如2xx、3xx、4xx、5xx)。6.请讲解一下四层网络负载均衡和七层网络负载均衡的区别,以及各自的应用场景。7.请讲一下反向代理的原理和常用工具,以及正向代理的相关内容。8.进程间通信的方式有哪些?哪种方式效率更高,为什么?9.请讲一下MySQL主从复制的实现原理(基于binlog、redolog相关)。10.多个从节点之间出现数据不一致的问题该如何解决?11.你了解的消息中间件有哪些?RabbitMQ、RocketMQ、Kafka这三种消息中间件的区别是什么?12.Redis中最常用的数据结构有哪些?13.请讲一下Redis中Zset(sorted set)的底层实现和优化策略。14.什么是小哈希和大哈希,二者在查找、插入性能上有什么区别?15.请讲一下TCC分布式事务算法的相关内容,以及它和2PC、3PC的区别。16.你在项目中使用的服务发现组件是什么,它的实现原理是什么?17.你在项目中使用的序列化协议是什么,为什么选择该协议?18.长连接的适用场景是什么?哪些场景不适合使用长连接,原因是什么?19.请设计一个评论系统(包括数据库表设计、数据结构、关联关系等)。20.【反问】想具体知道会做哪些模块的工作?有没有导师?
百特曼3:节子还是一如既往的八股大厂
查看78道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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