作者:余小小
日期:2021-10-02
进制的换算
也就是对常见的几种进制类型进行相互转换,从数学的角度来看。
c会将所有的信息,最终转成二进制,让计算机执行。
所有的进制数值都是在正数操作,负数操作的后面在提。
B和b
Byte,字节。字节跳动
bit(binary digit),比特。
一个大B= 8b,在计算机内存里的bit和bite的关系,我习惯把Byte叫做大B,bit叫做小b。
这里规定了一个单位法则一个B=8b,也就是说1字节=8位.为啥是8位,可能是我们喜欢8这个数字吧,当然计算机的存储有它的道理,就不深入了。
之前在基本数据类型中提到过的int占用4个字节,short占用2个字节,long占用4个字节说的就是Byte。
在c里一个数字、字母、标点符号各占一字节,一个汉字占两个字节。
关于一些内存单位的换算:
-
1KB=1024B, 1MB=1024KB
-
1GB=1024MB,1TB= 1024GB
-
1PB= 1024TB, 1ZB = 1024PB
十进制转二进制(重要)
在c中,因为printf函数无法输入二进制的数,所以无法直观的看见二进制样子,那么只有通过数学上的换算来看了。
我这里全程用数学上的逻辑来分析转换的整个过程。
原始粗暴的方式,方式一:
二进制由01构成,且这里总共2位数字
-
首先,我们拿到一个十进制的数,比如22,按照中学数学中的方式,要转成啥进制,就除啥。
-
我要转成二进制,那么就疯狂除以2,一直到<=1为止。
-
记录所有的余数(0,1,1,0,1)
-
所谓的一直到<=1为止,就是剩下的无法进行除法了,就直接写下来,就不进行运算了。比如最后剩下的1.
-
将所有的余数倒过来:10110(为啥要倒过来?)你想想,二进制最小在右边,而十机制最小在左边,然后呢?你说该不该换
-
则1010就是22的二进制表达式
-
那么,在计算机中,为了凑成8位,所以需要添加0来凑数,则完整点写法就是00010110,当然,考试或者测验,能到10110就够了。
可以参考:
优雅一点的方式,方式二:
在计算机中,最喜欢的就是1024,也就是2的10次方,那么,从数学角度分析,二进制在换算的时候,其实就是按照2的多少次方然后进行汇总。因为二进制吧,底数始终都是2,所以就可以从这个规律入手。
-
先在小本本上列出0,2,4,8,16,32,64,128.256,512,1024(分别从0开始,2的1次方,2的2次方,一直到2的10次方)
-
在这里的这些数字,都是代表的字节大小。而不是比特哈,这里是大B。方式一操作才是小b
-
简单的翻译一下数字,将B翻译成小b
-
0=00000000,2=00000010,3=00000011,4=000000100,这个3,是我后面加的,虽然列出的数字中没有,但是为了清晰
-
这里就有一个规律了:奇数转换成二进制,最右边是1,如果是偶数,则是0;
-
那么换算22这个数.由上面小本本写的几个数能构成的最简单加法式子写法是:2,4,16,当然你不要加个0说0+2+4+16,你也不要说用32-16+2+4+0,这种脱了裤子放屁的事情就不要做了。这里只考虑纯加法不看0
-
所以呢?我们在2和4和16的下面写上1啊。其他没用到的就是0,那么就是:011010000000
-
但是这里超过了8个数字,那你有8个数字了后面的就不要了呗,所以就是01101000
-
当然这里也需要倒过来才是正确答案即00010110,
好的知道了为啥小本本上要写这么多,你管三七二十一,你直接写了再说,反正写到512左右就OK,因为考试不会考多大的数字。
综上所述,如果10进制转换成二进制,如果十进制是偶数,用方法二,如果是奇数则用方法一
上机操作,方式三
#include <stdio.h>
#include <stdlib.h>
int main()
{
char b[100];
itoa(22,b,2);
printf("22转成二进制:%s",b);
}
-
引入#include <stdlib.h>
-
使用itoa函数进行转换
-
只能使用字符串输出
总结十进制换算其他进制步骤
这里测试是十进制换二进制,如果是换8进制,则方法雷同
这个方法只限于其他进制是小于10之内能,比如转16进制就不行了
-
看数的奇偶,奇数直接开除2,偶数用小本本写下来,然后寻找最优加法
-
将所得结果凑8位,然后反写
二进制转十进制(重要)
在c中,二进制转十进制是很方便的,甚至是可以直接定义相关的变量,也就是说,可以直接使用
但是没必要直接写二进制的数值,因为我看不懂。
这里需要明白,二进制的写法,一大B= 8小b,用0凑成8个小b
在c中二进制的前缀是0b或者0B,否则定义就是一个十进制
原始粗暴的方式,方式一
去掉二进制前缀,也就是不看二进制的前缀
既然和2有关,那么,直接把2作为底数,然后从右边开始,第1位是2的0次方,第二位是2 的1次方,第三位是2的2次方然后加起来就OK,
高中说过的。例如00001111转成十进制=1×2的0次方+1×2的1次方+1×2的2次方+1×2的3次方=1+2+4+8=15
如果给个111当然自己要知道前面是有5个0的即00000111;然后同理可得1+2+4=7
如果写成0b或者0B111要明白哦,这个也是二进制。二进制的前缀就是0b或者0B
上机操作,方式二
这个和二进制数值的数类型有关,一般默认都是int类型,所以用%d来占位
十进制占位符:(全部是小写字母)
-
%hd:对应short
-
%d:对应int
-
%ld:对应long
#include <stdio.h>
int main()
{
printf("111转成十进制:%d",0B111);
}
十进制转八进制(重要)
原始粗暴的方式,方式一
二进制由0,1,2,3,4,5,6,7构成,且这里总共8位数字
-
首先,我们拿到一个十进制的数,比如22,按照中学数学中的方式,要转成啥进制,就除啥。
-
我要转成二进制,那么就疯狂除以8,一直到<=7为止。
-
记录所有的余数 62
-
所谓一直到<=7为止,就是剩下的无法进行除法了,就直接写下来,就不进行运算了。比如最后剩下的2.
-
将所有的余数倒过来:26(为啥要倒过来?)你想想,二进制最小在右边,而十机制最小在左边,然后呢?你说该不该换
-
添加前缀0,即026,前缀是数字0
考试的时候,如果严格要求格式,不要忘记了前缀
上机操作,方式二
这个和二进制数值的数类型有关,一般默认都是int类型,所以用%o来占位
八进制的占位符:(全部是小写字母)
-
%ho:对应short
-
%o:对应int
-
%lo:对应long
#include <stdio.h>
int main()
{
printf("十进制22转成八进制:%o",22);
}
八进制转十进制(重要)
所以使用二进制转十进制的方式雷同操作
八进制的前缀,数字0
十进制没有前缀
原始粗暴的方式,方式一
去掉八进制前缀,也就是不看八进制的前缀
直接把8作为底数,然后从右边开始,第1位是8的0次方,第二位是8 的1次方,第三位是8的2次方然后加起来
比如之前测试的026,转成十进制后就是=6×8的0次方+2×8的1次方=6+16=22;
再来一个:033 = 3+24=27
上机操作,方式二
这个和八进制数值的数类型有关,一般默认都是int类型,所以用%d来占位
十进制占位符:(全部是小写字母)
-
%hd:对应short
-
%d:对应int
-
%ld:对应long
#include <stdio.h>
int main()
{
printf("八进制26转成十进制:%d",026);
}
八进制转二进制
不能直接除
原始粗暴的方式,方式一
学了八进制转十进制且简单和十进制转二进制的方式多样性,为了不增加大脑负担,可以分两部转换
-
将八进制数先转十进制
-
然后再将十进制转成二进制
其他方式参考:
反正我懒得记忆了
上机操作,方式二
#include <stdio.h>
#include <stdlib.h>
int main()
{
char b[100];
itoa(026,b,2);
printf("八进制26转成二进制:%s\n",b);
}
二进制转八进制
原始粗暴的方式,方式一
学了二进制转十进制且简单和十进制转八进制,为了不增加大脑负担,可以分两部转换
-
将二进制转十进制
-
然后再将十进制转成八制
其他方式参考:
上机操作,方式二
这个和二进制数值的数类型有关,一般默认都是int类型,所以用%o来占位
八进制的占位符:(全部是小写字母)
-
%ho:对应short
-
%o:对应int
-
%lo:对应long
#include <stdio.h>
int main()
{
printf("二进制转八进制:%o\n",0B10110);
}
十进制转十六进制
十六进制的前缀很重要,0x,数字零和字母x
原始粗暴的方式,方式一
十六进制的组成,用数字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F(a、b、c、d、e、f)表示,其中:A~F表示10~15,这些称作十六进制数字。
-
首先,我们拿到一个十进制的数,比如22,按照中学数学中的方式,要转成啥进制,就除啥。
-
我要转成十六进制,那么就疯狂除以16,一直到<=15为止。
-
记录所有的余数(6,1)
-
所谓的一直到<=15为止,就是剩下的无法进行除法了,就直接写下来,就不进行运算了。比如最后剩下的1.
-
将所有的余数倒过来:16,不要忘记了前缀,所以就是0x16
上机操作,方式二
十六进制由数字 0~9、字母 A~F 或 a~f(不区分大小写)组成,使用时必须以0x
或0X
(不区分大小写)开头,是数字0和字母x
这个和十六进制的数类型有关,一般默认都是int类型,所以用%x来占位
十六进制占位符:
-
%hx 或者 %hX:对应short
-
%x 或者 %X:对应int
-
%lx 或者 %lX:对应long
#include <stdio.h>
int main()
{
printf("十进制22转十六进制:%x\n",22);
}
这里编译器省略了前缀:0x
十六进制转十进制
和二进制转十进制类似,和八进制转十进制类似
原始粗暴的方式,方式一
所有的其他进制直接转十进制的时候,需要从右边开始看
例如我这里有个十六进制的数0x1245需要转换成十进制,所以呢?
从右到左5×16的0次方+4×16的1次方+2×16的2次方+1×16的3次方=5+64+512+4096=4677
如果是0xF4呢
则是4×16的0次方+Fx16的1次方,这里的F则是15因为是0到15嘛,用的英文字母表示的而已啦
所以是4+240=244
如果是0x16呢,则0x16=6×1+1×16=22
上机操作,方式二
这个和十六进制数值的数类型有关,一般默认都是int类型,所以用%d来占位
十进制占位符:(全部是小写字母)
-
%hd:对应short
-
%d:对应int
-
%ld:对应long
#include <stdio.h>
int main()
{
printf("十六进制0xF4转十进制:%d\n",0xF4);
}
暂无评论内容