图形背后的数字世界,计算机是如何存储数据的?
↑↑ 点击上方蓝色字关注我↑↑
如果你在大学学过计算机相关课程,那么你或许会知道:在我们漂亮的图形界面之下,其实所有的数据都是用 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 程序员的个人成长,分享最新技术资讯与技术干货。与你成长有关的,我们这里都有。
↑↑创作不易,如果喜欢请转发↑↑