一、编码理解:
1、原码:
- 正数:按照绝对值大小转换成的二进制数;
- 负数:按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。
00000000 00000000 00000000 00000101 是 5的 原码;
10000000 00000000 00000000 00000101 是 -5的 原码。
2、反码:
- 正数:与原码相同;
- 负数:该数的原码除符号位外各位取反。
正数00000000 00000000 00000000 00000101 的反码还是 00000000 00000000 00000000 00000101 ;
负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。
称:10000000 00000000 00000000 00000101 和 11111111 11111111 11111111 11111010互为反码。
3、补码:
- 正数:与原码相同;
- 负数:该数的原码除符号位外各位取反,然后在最后一位加1。
10000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
二、二进制
00000000 00000000 00000000 00000101 是 5的 原码;
10000000 00000000 00000000 00000101 是 -5的 原码。
正数00000000 00000000 00000000 00000101 的反码还是 00000000 00000000 00000000 00000101 ;
负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。
称:10000000 00000000 00000000 00000101 和 11111111 11111111 11111111 11111010互为反码。
10000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
数据的二进制表示即为数据的补码,也是计算机底层的存储方式。
- 正数的反码和补码都与原码相同。
- 负数的原码为:绝对值转换为二进制,然后最高位补1,称为原码;
- 负数的反码为:对该数的原码除符号位外各位取反。
- 负数的补码为:对该数的原码除符号位外各位取反,然后在最后一位加1。
三、十进制转二进制
3.1 整数:即求补码的方法(除基倒取余法)
3.1.1 正整数:
- 输入一个十进制数n;
- 每次用n除以2;
- 把余数记下来,再用商去除以2...
- 依次循环,直到商为0结束;
- 把余数倒着依次排列,就构成了转换后的二进制数。
3.1.2 负整数:
- 先取绝对值得到正数;
- 求出该正数的二进制表示,方法参考上面;
- 对上一步的结果最高位补1,得到该负整数的原码;
- 根据改原码求补码,即为二进制;(除符号位外各位取反,然后在最后一位加1。)
3.2 小数:(不分正负)
3.2.1 方法:乘2取整,顺序排列
3.2.2 具体步骤
- 用2乘十进制小数,可以得到积;
- 将积的整数部分取出,再用2乘余下的小数部分,又得到一个积;
- 再将积的整数部分取出,如此进行,不断重复2;
- 直到积中的小数部分为零或者达到所要求的精度为止。
四、二进制转十进制
4.1 正整数:(最高位为符号位)
4.1 正整数:(最高位为符号位)
例:
二进制正数:0000 1010 (十进制为10)
转换为十进制数: 1*2^3+0*2^2+1*2^1+0*2^0=10
4.2 负整数:(最高位为符号位)
+10的原码:0000 1010
-10的原码:1000 1010
-10的反码:1111 0101
-10的补码:1111 0110
最终。-10的二进制:1111 0110 (十进制为-10)
转换为十进制数:
1*2^6-1*2^5-1*2^4-0*2^3-1*2^2-1*2^1-0*2^0
=2^4-2^2-2^1=16-4-2=10(前面加一个负号,即为-10)
注意:
- 最高位为符号位,不做计算;
- 计算时,从左往右,从2^0开始。所以8位有符号二进制,符号位后的第一位对应的是2^6,而不是2^7
4.3 小数:
二进制:0000 1010.1100
转换为十进制:
小数点前+小数点后
= (1*2^3+0*2^2+1*2^1+0*2^0)+(1*2^(-1)+1*2^(-2)+0*2^(-3)+0*2^(-4))
=10+0.75
=10.75
五、参考:
- 负数与二进制换转方法 - 益达先生的个人空间 - 开源中国 https://my.oschina.net/lolsi/blog/269154
注:主要是对原码、反码、补码的介绍。
注:主要是对原码、反码、补码的介绍。