写在后面

应很多小伙伴的要求,我开了一个新的专题【程序员进阶系列】,在这个专题中,我会跟大家分享无关计算机和软件的一系列 底层 常识,让小伙伴们更好的了解计算机的底层架构常识,可能更好的进步本身的编程能力和软件设计能力。本篇就作为整个专题的开篇,心愿可能为小伙伴们带来实质性的帮忙。

数据的示意

在计算机中,所有的数据都是以二进制的模式进行示意的,也就是说,在计算机中应用0和1来示意所有的数据。而咱们日常生活中的数字都是10进制的,那咱们平时应用的数字如果在计算机中示意时就须要进行进制的转换。

进制转换

R进制转10进制

R进制转10进制能够应用按权开展的办法,具体的操作就是:将R进制数的每一位数值应用R^k^示意,底数是R,指数是k。其中,k与该位和小数点之间的地位无关。当这个地位位于小数据右边时,k的值是从小数点向左顺次数的个数,须要留神的是:紧邻小数点的数字地位为0,接下来是1,2...顺次类推。同样的,如果这个地位在小数点的左边,则紧邻小数据点地位的数字从-1开始,顺次向右数为-2,-3等等,依此类推。

例如,咱们给出一个二进制数字,11010101.01,转换为10进制数字为:1 x 2^7^ + 1 x 2^6^ + 0 x 2^5^ + 1 x 2^4^ + 0 x 2^3^ + 1 x 2^2^ + 0 x 2^1^ + 1 x 2^0^ + 0 x 2^-1^ + 1 x 2^-2^。

再比方,咱们给出一个八进制数,76128.01,转换为10进制数字为:7 x 8^4^ +6 x 8^3^ + 1 x 8^2^ + 2 x 8^1^ + 8 x 8^0^ + 0 x 8^-1^ + 1 x 8^-2^

十进制转R进制

十进制转R进制就比较简单了,这里咱们能够应用短除法。

例如,将十进制数字69转换为二进制的过程如下所示。

得出短除的后果后,咱们须要将余数倒过去排列即为十进制69转换为二进制的后果,所以后果数据为:1000101。

二进制与八进制互转

二进制转八进制时,每三位二进制数示意一个八进制数。因为在八进制中,总共有8个基数,别离是0~7,逢8进1。而如果要应用二进制来示意时,0的二进制为000,7的二进制为111,所以,每三位二进制数对应一位八进制数。反过来,每一位八进制数对应三位二进制数。

具体的划分策略是,从二进制的低位开始,从低到高,也就是从右向左,每三位二进制数对应一个八进制数,有余三位的后面补0,例如,咱们将二进制数:10001110转化为八进制数的过程,具体如下所示。

所以,二进制数10001110转化为八进制数的后果为216。

同理,八进制转二进制与二进制转八进制正好相同,八进制的每一位对应三位的二进制数。也就是说,将八进制数的每一位转化成三位的二进制数即可。

二进制与十六进制互转

在十六进制示意的数字中,总共有15个基数,为0~15,逢16进1。如果要将二进制数转化为十六进制数时,首先要弄清楚每位十六进制数须要多少为二进制数示意。在十六进制中,最大的基数为15,15的二进制示意为:1111,最小的基数为0,0的二进制数为0000,也就是说,十六进制的根底应用二进制示意为 0000~1111,所以,每位十六进制数须要四位二进制数示意。

从二进制数的低位开始,也就是从右侧开始,每四位二进制数对应一位十六进制数。

例如,咱们须要将二进制数10001110转换为十六进制数,如下所示。

留神:在十六进制中,别离应用A,B,C,D,E,F代表10,11,12,13,14,15。

所以,二进制10001110转化为十六进制的后果为8E。

十六进制转二进制与二进制转十六进制正好相同,将十六进制的每一位转换为四位二进制数即可。

数据的码制

在计算机中,带符号的机器数能够采纳原码、反码、补码和移码示意,这些编码称为码制。

原码

在原码示意中,最高位是符号位,0示意正号,1示意负号,其余的n-1位示意数值的绝对值,数值0的原码有两种示意模式:$[+0]_原$ = 0 0000000,$[-0]_原$ = 1 0000000。

反码

在反码中,最高位是符号位,0示意正号,1示意负号,负数的反码与原码雷同,正数的反码是其绝对值按位取反。数值0的反码有两种示意模式:$[+0]_反$ = 0 0000000,$[-0]_反$ = 1 1111111。

补码

在补码中,最高位是符号位,0示意正号,1示意负号,负数的补码与原码和反码雷同,正数的补码等于其反码的末位加1。在补码的示意中,0有惟一的补码:$[+0]_补$ = 0 0000000,$[-0]_补$ = 0 0000000。

移码

移码表示法是在数X上减少一个偏移量来定义的,罕用于示意浮点数中的阶码。如果机器字长为n,规定偏移量为 2^n-1^。

实际上,在偏移 2^n-1^的状况下,只有将补码的符号位取反就能够取得相应的移码。

码制总结

咱们来看上面的表格,这里,我间接应用八位的二进制数来示意相应的数值。

码制数值1数值-11-1
原码0000 00011000 00011000 0010
反码0000 00011111 11101111 1111
补码0000 00011111 11110000 0000
移码1000 00010111 11111000 0000

通过表格咱们发现:

  • 负数的原码、反码和补码是雷同的。
  • 正数的反码是原码除符号位外,其余位别离取反;
  • 正数的补码是其反码的末位加1。
  • 移码是在补码的根底上符号位取反失去。

在正数的原码和补码的转换中,咱们能够得出如下论断:

  • 正数的原码转补码是在原码的根底上除符号位外,其余位取反,而后末位加1。
  • 正数的补码转原码是在补码的根底上除符号位外,其余位取反,而后末位加1。

也就是说,正数的原码转补码和补码转原码的规定是一样的。小伙伴们能够依据表格自行验证

计算机应用补码进行加减法运算

咱们再来看表格的最初一列 1-1,在计算机中,示意为1+(-1),其正确的后果应该为0。接下来,咱们别离剖析下应用原码、反码、补码和移码进行加减法运算的后果的正确性。

  • 表格的第一行中,应用原码计算的后果为1000 0010,转换为10进制数为-2,1-1不等于-2,所以,应用原码进行加减法运算的后果是谬误的。
  • 在反码中,计算1-1的后果为1111 1111,显然后果不为0,所以,应用反码进行加减法运算的后果是谬误的。
  • 在补码中,计算1-1的后果为0000 0000,后果为0,所以,应用补码进行加减法运算的后果是正确的。
  • 在移码中,计算1-1的后果为1000 0000,后果为-0,尽管-0也等于0,然而严格意义来讲,这个后果是不正确的。

在计算机中,不会应用移码进行加减法运算,移码用于浮点数的阶码。

好了,明天就到这儿吧,我是冰河,大家有啥问题能够在下方留言探讨~~