1.进制转换
二进制转十进制
10112=1×23+0×22+1×21+1×20=1110
十进制转二进制
分整数部分和小数部分两步进行:
- 整数部分:不断除以2,记录余数,直到商为0,然后将余数倒序排列。
- 小数部分:不断乘以2,记录整数部分,直到小数部分为0或者达到所需的精度。
例子:将10.625转换为二进制。
-
整数部分10:
10÷2=5,余数0
5÷2=2,余数1
2÷2=1,余数0
1÷2=0,余数1
整数部分二进制为1010。
-
小数部分0.625:
0.625×2=1.25,整数部分1
0.25×2=0.5,整数部分0
0.5×2=1.0,整数部分1
小数部分二进制为0.101。
-
最终结果:10.625的二进制表示为1010.101。
二进制用八、十六进制表示
- 八进制:每3位二进制对应1位八进制。例如,二进制1010.101可以分为(001)(010).(101),对应的八进制为12.5。
- 十六进制:每4位二进制对应1位十六进制。例如,二进制1010.101可以分为(0001)(0100).(1010),对应的十六进制为14.A。
2.整数的表示
无符号整数
无符号整数使用二进制表示非负整数,范围为0到2n−1,其中n是二进制位数。
例如uint32_t类型的无符号整数使用32位二进制表示,范围为0到232−1=4,294,967,295。
有符号整数
有符号整数使用二进制表示正数和负数,常见的表示方法有原码、反码和补码。
原码
原码使用最高位表示符号,0表示正数,1表示负数,剩余位表示数值。例如,8位原码表示的范围为-127到127。
原码在处理负数时存在两个零(+0和-0)的问题。而且正数与负数的加减运算需要特殊处理。
反码
反码是原码的基础上将负数的每一位取反得到的表示方法。
反码在处理负数时也存在两个零的问题,并且加减运算仍然需要特殊处理。
补码
补码即按位取反加1,是目前最常用的有符号整数表示方法。
补码的优点是只有一个零(0),并且加减运算可以直接使用二进制加法器进行处理,无需特殊处理。
例子:
−8的8位补码表示为:
- 首先将8的二进制表示为00001000。
- 然后按位取反得到11110111。
- 最后加1得到11111000,即-8的补码表示。
补码加减原理:
以8位补码为例:
−8+5=−8+256+5//8位补码里加256相当于加 100000000,最高位溢出,值不变=−8+255+1+5=(11111111−00001000+00000001)+00000101//括号内是 −8 的补码(取反+1)=11111000+00000101=11111101//结果是 −3 的补码表示
补码转为原码:
一样取反加1
补码取值范围:
- 对于n位补码,范围是−2n−1到2n−1−1。
- 例如
int32类型的补码表示范围为-2,147,483,648到2,147,483,647。