目录
进制转换:
为什么要使用二进制、八进制、十六进制
因为现在的CPU只能识别高低两种电流,只能对二进制数据进行计算
二进制虽然可以直接被CPU识别计算,但是不方便书写、记录,
所以把二进制数据转换成八进制是为了方便记录到文档中
随着CPU的不断发展,位数不停增加,由早期的8位逐渐发展到现在的64位,
因此八进制不再能满足需求,所以发展出了十六进制。由于历史原因,八进制还不能完全地退出历史舞台。
十进制转二进制:(转其他进制)
求余法:用2对数据求余,记录余数,然后继续对商求余,直到商为0结束,过程产生的余数就是该数据的二进制(逆序)
n % 2 = 0 | 1
商 % 2 = 0 | 1
直到商为0
127 % 2 1
63 % 2 1
31 % 2 1
15 % 2 1
7 % 2 1
3 % 2 1
1 % 2 1
0 0 ↑
127 → 01111111
求权法:从高位到低位,数据 - 2^(n-1) ,如果能减,第n位就是1,否则就是0
137
128 64 32 16 8 4 2 1
1 0 0 0 1 0 0 1
137→10001001
手算:
79 →1001111
63 →111111
121 →1111001
49 →110001
练习1:输入一个正整数以及m(>=2),显示该正整数的m进制,超过10进制用字母表示 10A 11B 12C ...
二进制转十进制
每位的2^(n-1)求和
10011010
128+16+8+2 = 154
二进制转八进制
低位起:每三位二进制对应一位八进制
二进制:1 001 101 110 010
八进制:1 1 5 6 2
二进制转十六进制
低位起:每四位二进制对应一位十六进制
二进制: 1 1011 0111 1010
十六进制:1 B 7 A
C语言中:以0开头的数据都是八进制,以0x开头的数据都是十六进制
%o 以八进制形式显示数据
%x 以十六进制形式显示数据
%#o %#x 以对应格式显示不同进制
原码、反码、补码:
原码:
数据的二进制 -10 10001010
反码:
正数的反码就是原码
负数的反码是原码除符号位外,其他位按位求反
-10 11110101
补码:
所有的数据在内存中都是以补码形式存储
正数的补码就是原码
负数的补码:
1、先转成二进制原码
2、原码的符号位不变,其它按位求反得到补码
3、反码+1得到补码
-127
1111 1111 原码
1000 0000 反码
1000 0001 补码
0x81
%hd 0000 0000 1000 0001 == 129