周其仁:停止改革,我们将面临三大麻烦

抛开立场观点不谈,且看周小平写一句话能犯多少语病

罗马尼亚的声明:小事件隐藏着大趋势——黑暗中的风:坚持做对的事相信未来的结果

布林肯突访乌克兰,为何选择去吃麦当劳?

中国不再是美国第一大进口国,贸易战殃及纺织业? 美国进一步延长352项中国商品的关税豁免期

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

图形背后的数字世界,计算机是如何存储数据的?

陈树义 树哥聊编程 2022-10-25

↑↑ 点击上方蓝色字关注我↑↑



如果你在大学学过计算机相关课程,那么你或许会知道:在我们漂亮的图形界面之下,其实所有的数据都是用 1 和 0 来表示的。对于机器来说,它们不懂得什么是图标,不懂得什么是红色,不懂得什么是网页,等等。对于机器来说,它们只认识两个数字:1 和 0。简单地说,1 和 0 就是数字世界的水和电。

在 1 和 0 之上,我们伟大的先贤们为了表示更大的数字发明了一套书值表示方法:原码、反码、补码。从这名字我们就可以感觉得出,其实这三个东西就是一种编码。按照特定规则,表示特定书值。

下面我们就来聊聊这三种最基础的编码方式。

原码

原码,其实就是符号位加上数字的二进制表示。不知道二进制的同学,自己先去百度吧。以 Java 中的 byte 类型为例,第 1 位表示符号位(正数或负数),其余 7 位表示该数字的二进制值。那么 10 的原码是:

10 的原码:0000 1010
-10 的原码:1000 1010

原码的表示非常简单,就一个符号位和数值位组成。

反码

反码反码,意思就是在原码的基础上取反一下就是反码了。这就是反码的字面意思。

对于正数来说,它的反码与原码相同。对于负数来说,它的反码是在原码的基础上,符号位不变,其余位取反。

还是以 byte 类型的 10 为例,其原码与反码如下:

10 的原码:0000 1010
10 的反码:0000 1010    //正数的反码与原码相同

-10  的原码与反码如下:

-10 的原码:1000 1010
-10 的反码:1111 0101    //在原码基础上,符号位不变,其余位取反

怎么样,弄懂了吗?不急着记,我们还有一个补码。

补码

补码补码,意思就是在反码的基础上修修补补就成了补码了。

对于正数来说,它的补码就是反码,其实也就是原码。而对于负数来说,它的补码就是反码加 1。

还是以 byte 类型的 10 为例,其原码、反码、补码如下:

10 的原码:0000 1010
10 的反码:0000 1010    //正数的反码与原码相同
10 的补码:0000 1010   //正数的补码与反码、原码相同

-10 的原码、反码、补码如下:

-10 的原码:1000 1010
-10 的反码:1111 0101    //在原码基础上,符号位不变,其余位取反
-10 的补码:1111 0110  //负数的补码,就是在反码的基础上加 1。

一路看下来,你会发觉计算机世界对于正数真是非常偏爱啊。基本上一个行头走遍天下,而负数这小伙子则是苦逼多了,每换一种表示方法,都要反一反,补一补,甚是可怜。

总结

图形背后的世界,其实就是一个个的 1 和 0,它们使用补码的方式存储。而补码又跟原码、反码有千丝万缕的联系。要知道补码,就得知道原码和反码。

正数的原码、反码、补码都一样,非常简单。负数的原码、反码、补码,略微复杂,但也不难记住。记住一句话就够了:反码就取反,补码就补1。

今天的内容很简单,但却是计算机科学基础中的基础,弄清楚原码、反码、补码的意义和联系,可以为之后学习更深层次的内容打下良好基础。



推荐阅读


公众号@Java技术精选,关注 Java 程序员的个人成长,分享最新技术资讯与技术干货。与你成长有关的,我们这里都有。


↑↑创作不易,如果喜欢请转发↑↑



文章有问题?点此查看未经处理的缓存