进制转换:
为什么使用二进制、八进制、十六进制?
cpu只能识别高低两种电流,只能对二进制数据进行计算
二进制虽然可以直接被cpu识别计算,但是对于人来说是不方便书写、记录的,所以把二进制的数据先转换成八进制是为了方便记录到文档中
随着cpu的不断发展,cpu的位数不断增加,由早期的八位逐渐发展到现在的64位,因此八进制不再能满足需求,所以发展出了十六进制,由于历史原因,所以八进制还不能完全退出历史舞台
转换方式:
十进制转二进制(转其他所有进制都可用):
求余法:用2对数据求余,记录余数,然后继续对商求余,直到商为0结束,,过程中产
生的余数就是该数据的二进制(逆序)
例:
127 % 2 1
63 % 2 1
31 % 2 1
15 % 2 1
7 % 2 1
3 % 2 1
1 % 2 1
0
得:
01111111
求权法:从高位到地位,数据 - 2^(n-1),如果能减,第n位就是1,否则就是0
例:
137 --> 128 64 32 16 8 4 2 1
1 0 0 0 1 0 0 1
手算:
79 63 121 49
二进制转十进制:
每位的2^(n-1)求和
10011010 --> 128+16+8+2 = 154
二进制如何转八进制
低位起,每三位二进制位对应一位八进制
二进制: 001 001 101 110 010
1 1 5 6 2
二进制如何转十六进制
低位起,每四位二进制位对应一位十六进制
二进制: 1 1011 0111 1010
十六进制: 1 B 7 A
在C语言中:只要以0开头的数据都是八进制,以0x开头的数据都是十六进制数据
%o 以八进制形式显示数据
%x 以十六进制形式显示数据
%#o %#x 以对应格式显示不同进制
练习:输入一个正整数以及m,然后显示该正整数的m进制是多少(m >= 2),超过10进制的如十六进制:10->A 11->B 12->C 13->D 14->E 15->F
char arr[32] = {},yu; //yu用于储存余数
int num = 0,n = 0,i = 0;
printf("输入一个正整数和一个n:");
scanf("%d %d",&num,&n);
while(0 != num)
{
yu = '0'+num%n;
if('9' < yu)
yu = 'A'+yu-'9'-1;
arr[i] = yu;
i++;
num /= n;
}
for(int k = i-1; k>=0; k--)
{
printf("%c ",arr[k]);
}