进制
世界上有10种人 ,认识和不认识二进制的。
-
对于整数,有四种表示方式:
二进制(binary):0,1 ,满2进1。以0b或0B开头。
十进制(decimal):0-9 ,满10进1。
八进制(octal):0-7 ,满8进1。 以数字0开头表示。
十六进制(hex):0-9及A-F,满16进1。以0x或0X开头表示。此处的A-F不区分大小写。 -
进制转换:
- 二进制转十进制:2的(位数-1)次幂的和。
- 十进制转二进制:除2取余的逆。
- 二、八、十六进制互转:从低位向高位,每3位二进制为1位八进制,每4位二进制为1位十六进制。
整数的二进制表示
正数(32位为例)
-
正数的原码、反码、补码都相同
// 6的原码、反码、补码相同 00000000 00000000 00000000 00000110
负数
-
原码:直接将一个数值换成二进制数,最高位是符号位。
-
反码:对原码按位取反,符号位不变。
-
补码:反码加1。
// -6的原码 10000000 00000000 00000000 00000110 // -6的反码(原码取反,符号位不变) 11111111 11111111 11111111 11111001 // -6的补码(反码+1) 11111111 11111111 11111111 11111010
模(Modulo)
-
模是一个计量系统的计数范围。如时钟(mod = 12)、星期(mod = 7)、64位计算机(mod = 263)等。
-
模是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。如12的余数有0,1,2,3,4,5,6,7,8,9,10,11。
// 以模为12的系统为例,假设将当前时针指向11点校准为8点,调整方式有两种: 11 - 3 = 8 // 逆时针拨动4个小时 11 + 9 = 12 + 8 = 8 // 顺时针拨动9个小时 // 在以模为12的系统中,加9和减3效果是一样的,即3和9互为补数
ps:在有模的计量系统中,减一个数等于加上它的补数,从而实现将减法运算转化为加法运算的目的。
补码原理
// 以4位的数据为例:11 - 3 = 8
// 等价于
11 + (16 - 3)
// 二进制表示:
1011 + (1 0000 - 0011)
// 等价于
1011 + ((1 + 1111) - 0011)
// 等价于
1011 + ((1111 - 0011) + 1) // 即11+(-3的反码+1)
// 等价于
1011 + 1101 // 即11+(-3的补码)
// 得到结果
1000 // 1 1000 高位溢出,只保存4位
浮点数的二进制表示
数符 | 阶码 | 尾数 |
---|---|---|
sign | exponent | fraction |
不同浮点数的表示情况:
类型 | 数符 | 阶码 | 尾数 | 总位数 | 偏移值 |
---|---|---|---|---|---|
float | 1 | 8 | 23 | 32 | 127 |
double | 1 | 11 | 52 | 64 | 1023 |
ps:偏移值=2(阶码位数-1)-1
表示过程
-
分别把整数部分和小数部分转换成2进制
-
将二进制数据用科学计数法表示
-
分别得出数符、阶码和尾数
数符:浮点数为负,则为1;非负,则为0。
阶码:阶数 + 偏移值。
尾数:小数点后面的数。
// 例如:178.125
10110010.001 // 1.转化为二进制
1.0110010001 * 2^111 // 2.科学计数法表示
// 数符为:0,阶码为:111+01111111=10000110,尾数为:0110010001
0 10000110 01100100010000000000000
ps:由于科学计数法的最高位总是“1”,所以直接隐藏掉,同时节省了1个位出来存储小数,提高精度。