从零开始的嵌入式生活:c语言中的进制

一丶二进制

二进制由 0 和 1 两个数字组成,使用时必须以0b或0B(不区分大小写)开头,例如:

//合法二进制:

int a = 0b01;  //十进制1
 
int b = -0b1011;  //十进制-11

int c = 0B1111;   //十进制15

//不合法的二进制:

int m = 101010;  //没有前缀 这是一个十进制数

int n = 1012121;  //二进制只由0和1构成不能出现2

运算法则:逢二进一,借一当二

0B1101 - 0B0011 = 0B1010

0B1101 + 0B0011 = 0B10000

二进制转换十进制:

2048 1024 512 256 128 64 32 16 8 4 2 1

独特转化方法:将对应的二进制权位值进行相加即可得对应的十进制数

1 1 0 1 0 1 化成十进制:32+16+4+1 = 53

32 16 8 4 2 1 (权位值)

1    1  0 1 0 1

二进制转换八进制:

每3位二进制数按权展开,然后相加得到1位八进制数。(注意事项,每3位二进制转成八进制是从右到左开始转换,不足时补0)

1 1 0 1 1 1 0 二进制转化为八进制:156

0 0 1   1 0 1   1 1 0

----------------------------------------

  1          5          6

二进制转换十六进制:

每4位二进制数按权展开,然后相加得到1位十六进制数。(注意事项,每4位二进制转成十六进制是从右到左开始转换,不足时补0)

1 1 0 1 1 1 0 二进制转化为十六进制: 6e

0 1 1 0    1 1 1 0

----------------------------------------

    6            e 

二丶八进制

八进制由 0~7 八个数字组成,使用时必须以0开头(注意是数字 0,不是字母 o),例如:

//合法八进制
int a =  0105;    //换算成十进制69
int b = -0101;    //换算成十进制-65
int c = 017777;  //换算成十进制8191

//不合法的八进制
int m = 256;     //无前缀0,相当于十进制
int n = 0810;    //8不是有效的八进制数字

运算法则:逢八进一,借一当八

0751 - 0463 = 0266

0524 + 0356 = 01102 

八进制转换二进制:

将八进制数的每一位通过除2取余法得到一个二进制数,这个二进制数必须是3位,如果不够3 位,则最左补0

0736转化为二进制数:111011110

7           3        6

----------------------------------------

111     011       110

八进制转换十进制:

先将八进制转换为二进制然后转换为十进制

0736转化为十进制数:478

7           3        6

----------------------------------------

111     011       110

----------------------------------------

  256  128 64        32 16 8        4 2 1

八进制转换十六进制:

先将八进制转换为二进制然后转换为十六进制

0736转化为十六进制数:1de

7           3        6

----------------------------------------

111     011       110

 0001 1101     1110

----------------------------------------

 1       d          e

三丶十六进制

十六进制由数字 0~9、字母 A~F 或 a~f( 不区分大小写 A == 10 B==11 C==12 D==13 E==14 F==15)组成,使用时必须以0x或0X(不区分大小写)开头,例如:

//合法十六进制
int a =  0x2B;    //换算成十进制43
int b = -0xA0;    //换算成十进制160
int c = 0X70;     //换算成十进制112

//不合法的十六进制
int m = 5A;     //无前缀0X,是一个无效的数字
int n = 0x6H;    //H一个无效的十六进制数字

运算法则:逢十六进一,借一当十六

0x38 - 0x2A = 0xE

0x2A + 0x38 = 0x62

十六进制转二进制:

将十六进制数的每一位通过除2取余法,得到二进制数,每一位十六进制数得到的二进制数都应该是4位,不足时在最左边补零

7ac转换为二进制:011110101100

7      a      c

----------------------------------------

0111  1010  1100

十六进制转八,十进制:

先转换成二进制再一一转换

四丶十进制

和我们平时的书写格式一样,不再赘述

十进制转换为二进制:

将数字进行拆解,必须按最近最大权位值拆解,将有数字的位进行置即可

100 = 64 + 32 + 4

64 32 16 8 4 2 1

1    1    0 0 1 0 0

819 = 512 + 256 + 32 + 16 + 2 + 1 转化二进制:1 1 0 0 1 1 0 0 1 1

十进制转换为八,十六进制:

先转换成二进制再一一转换

五丶二进制数、八进制数和十六进制数的输出

C语言中常用的整数有 short、int 和 long 三种类型,通过 printf 函数,可以将它们以八进制、十进制和十六进制的形式输出。上节我们讲解了如何以十进制的形式输出,这节我们重点讲解如何以八进制和十六进制的形式输出,下表列出了不同类型的整数、以不同进制的形式输出时对应的格式控制符:

 

十六进制数字的表示用到了英文字母,有大小写之分,要在格式控制符中体现出来:

  • %hx、%x 和 %lx 中的x小写,表明以小写字母的形式输出十六进制数;
  • %hX、%X 和 %lX 中的X大写,表明以大写字母的形式输出十六进制数。

exp:

#include <stdio.h>
int main()
{
    short a = 0b1010110;  //二进制数字
    int b = 02713;  //八进制数字
    long c = 0X1DAB83;  //十六进制数字
   
    printf("a=%ho, b=%o, c=%lo\n", a, b, c);  //以八进制形似输出
    printf("a=%hd, b=%d, c=%ld\n", a, b, c);  //以十进制形式输出
    printf("a=%hx, b=%x, c=%lx\n", a, b, c);  //以十六进制形式输出(字母小写)
    printf("a=%hX, b=%X, c=%lX\n", a, b, c);  //以十六进制形式输出(字母大写)
    return 0;
}

输出

a=126, b=2713, c=7325603
a=86, b=1483, c=1944451
a=56, b=5cb, c=1dab83
a=56, b=5CB, c=1DAB83

 

输出时加上前缀

注意观察上面的例子,会发现有一点不完美,如果只看输出结果:

  • 对于八进制数字,它没法和十进制、十六进制区分,因为八进制、十进制和十六进制都包含 0~7 这几个数字。
  • 对于十进制数字,它没法和十六进制区分,因为十六进制也包含 0~9 这几个数字。如果十进制数字中还不包含 8 和 9,那么也不能和八进制区分了。
  • 对于十六进制数字,如果没有包含 a~f 或者 A~F,那么就无法和十进制区分,如果还不包含 8 和 9,那么也不能和八进制区分了。

区分不同进制数字的一个简单办法就是,在输出时带上特定的前缀。在格式控制符中加上#即可输出前缀,例如 %#x、%#o、%#lX、%#ho 等,请看下面的代码:

#include <stdio.h>
int main()
{
    short a = 0b1010110;  //二进制数字
    int b = 02713;  //八进制数字
    long c = 0X1DAB83;  //十六进制数字
   
    printf("a=%#ho, b=%#o, c=%#lo\n", a, b, c);  //以八进制形似输出
    printf("a=%hd, b=%d, c=%ld\n", a, b, c);  //以十进制形式输出
    printf("a=%#hx, b=%#x, c=%#lx\n", a, b, c);  //以十六进制形式输出(字母小写)
    printf("a=%#hX, b=%#X, c=%#lX\n", a, b, c);  //以十六进制形式输出(字母大写)
   
    return 0;
}

输出: 

a=0126, b=02713, c=07325603
a=86, b=1483, c=1944451
a=0x56, b=0x5cb, c=0x1dab83
a=0X56, b=0X5CB, c=0X1DAB83

 今日作业:

1、转换下面的进制

(1)十六进制转二进制

0x5E3 0x883 0xDDB

(2)十六进制转十进制

0x512 0xDE5 0x666

(3)八进制转十进制

0555 0741 0336

(4)十进制转十六进制

458 960 44

(5)十进制转二进制

10.25 20.145

注意:小数部分乘以进制,整数部分做为进制值,若值为1,再将小数部分乘以进制,直到乘积的小数为0,

作业解析:

(1)十六进制转二进制:

0x5E3  0x883  0xDDB

0x5E3 = 0b 0101 1110 0011

0x883 = 0b 1000 1000 0011

0xDDB = 0b 1101 1101 1010

(2)十六进制转十进制

0x512 0xDE5 0x666

0x512 = 0b 0101 0001 0010 = 1298

0xDE5 = 0b 1101 1110 0101 = 3557

0x666 = 0b 0110 0110 0110 =  1638

(3)八进制转十进制

0555 0741 0336

0555 = 0b101 101 101 =365

0741 = 0b111 100 001 =481

0336 = 0b011 011 110 =222

(4)十进制转十六进制

458 960 44

458=1 1100 1010=1ca

960=11 1100 0000=3c0

44 =0010  1100 =2c

(5)十进制转二进制

10.25 20.145

注意:小数部分乘以进制,整数部分做为进制值,若值为1,再将小数部分乘以进制,直到乘积的小数为0

0.25x 2 = 0..5 ---- 0

0.5 x 2 = 1. 0 ---- 1

1 0 1 0. 0 1

0.145X2 = 0.29 --- 0

0.29X2 = 0.58 --- 0

0.58X2 = 1.16 --- 1

0.16X2 = 0.32 --- 0

......

注: 由于小数部分的转换算法,有许多小数是无法成功换算的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值