计算机中的数据均以二进制形式保存。二进制跟十进制相似,但是只有0,1,逢2进1,十进制中的2就是二进制中的10。
1110 (2)= 1 * 23+1 * 22+1 * 21+0 * 20 = 14
问题:12(10)= ____(2)
这时候我们可以利用短除法,对十进制除以二取余,然后倒序排列得到二进制:
12%2 = 0·········· (1)
6%2 = 0············(2)
3%2 = 1············(3)
1%2 = 1············(4)
答案: 1100(2)
以上是正整数的十进制与二进制的转换,那么负整数呢?正分数和负分数呢?
负整数
首先我们要了解十六位的二进制能代表的范围:
无符号是0000 0000 0000 0000到1111 1111 1111 1111,转换成十进制是0~65535
有符号的时候第一位是符号位,0表示正数,1表示负数,其余为数值位。
对于原码,最小值是1111 1111 1111 1111,最大值是0111 1111 1111 1111,转换成十进制是-32767~32767。
最小值:1111 1111 1111 1111(2) =
$$
\frac{(1-2^{15})\cdot1}{1-2}
$$
=-32767 (10)
最大值:0111 1111 1111 1111(2) =
$$
\frac{(1-2^{15})\cdot1}{1-2}
$$
=32767 (10)
对于反码,只是数值位取反,符号位不变,所以数值不会变。
而对于补码,由于0的补码是固定的唯一的就是0000 0000 0000 0000,所以1000 0000 0000 0000表示的并不是0,而是
最小值-32768。为什么呢?因为在计算机中只有加法,而1000 0000 0000 0000实际上是溢出一位,应该是1 1000 0000 0000 0000,它的值为-215 = -32768。所以他的取值范围是1000 0000 0000 0000到0111 1111 1111 1111,即-32768~32767。正数的补码、反码都是原码本身。
小数
二进制转换成十进制
小数部分依次乘以2的负几次方
问题:0.001(2)= ____(10)
0 * 2-1+0 * 2-2+1 * 2-3 = 1/8 = 0.125
答案: 0.125(10)(保留5位小数)
十进制转换成二进制
小数部分乘以2,取整数部分,直至乘积没有小数部分,然后按序排放。例如:
问题:0.12(10)= ____(2)
0.12 * 2 = 0.24··········0(1)
0.24 * 2 = 0.48··········0(2)
0.48 * 2 = 0.96··········0(3)
0.96 * 2 = 1.92··········1(4)
0.92 * 2 = 1.84··········1(5)
······
答案: 0.00011(2)(保留5位小数)
我们都知道 int 类型占用4个字节,lang类型占用8个字节,字节类型占用一个字节,那么一个字节在二进制要如何表示呢?
在计算机中一个字节由八位二进制表示,所以最大是1111 1111 (255)超过255的话要用两个字节。