嵌入式软件--C语言学习 DAY 2

一、进制转换

1.常见的进制

  1. 二进制:0、1,满2进1。
  2. 十进制:0 - 9,满10进1。
  3. 十六进制:0 - 9及A-F,满16进1。十六进制中,除了 0 到 9 十个数字外,还引入了字母,以便表示超过9的值。字母A对应十进制的10,字母B对应十进制的11,字母 C、D、E、F 分别对应十进制的 12、13、14、15。
  4. 八进制:0-7,逢八进一。
二进制十进制八进制十六进制
0000
1111
10222
11333
100444
101555
110666
111777
10008108
10019119
10101012A
10111113B
11001214C
11011315D
11101416E
11111517F
10000162010
10001172111

2.不同进制在C语言中使用规范。

二进制:0B或0b

十进制:正常数字

十六进制:0X或0x,A-F不区分大小写

八进制:0

代码示例:

#include <stdio.h>

int main()
{
    int num,num1,num2,num3;
    num=0b1110;//二进制
    num1=12;//十进制
    num2=020;//八进制
    num3=0xf2;//十六进制
    printf("%d %d %d %d",num,num1,num2,num3);//输出
    return 0;
}

3.输出格式

不同的进制只是整数的书写方法不同,不会对整数的实际存储方式产生影响。不同进制可以混合使用,比如 10 + 015 + 0x20 是一个合法的表达式。

使用格式占位符可以将整数以不同进制形式输出,相关的格式占位符如下:

%d :十进制整数。

%x :十六进制整数。

%o:八进制整数。

%#x :显示前缀 0x 的十六进制整数。

%#X :显示前缀 0X 的十六进制整数。

%#o : 显示前缀的八进制整数。

代码例子:

#include <stdio.h>

int main()
{
    int num,num1,num2,num3;
    num=122;
    num1=122;
    num2=122;
    num3=122;
    printf("不带前缀的八进制整数:%o\n 带前缀的八进制整数:%#o\n 不带前缀的十六进制整数:%x\n 带前缀的十六进制整数:%#x ",num,num1,num2,num3);
    return 0;
}

4.十进制与二进制之间的转换

(1)十进制转二进制

方法:辗转相除。

例如:126

除以2的商取余
630
311
151
71
31
11
01

余数从下往上取:最终126转换为0B1111110

(2)二进制转十进制

从左边低位起,每一位的数字与2的n次幂的加和。(n是每一位的数位减一)

例如:0B11111110   0*2^0+1*2^1+1*2^2+1*2^3+1*2^4+1*2^5+1*2^6=2+4+8+16+32+64=126

5.十六进制与十进制之间的转换

(1)十六进制转十进制

规则:从最低位开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。

案例:请将0x34A转成十进制的数

10*16^0+4*16^1+3*16^2=10+64+768=842

(2)十进制转十六制

  1. 则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。
  2. 案例:请将356转成十六进制。
    除以16的商取余
    224
    16
    01

    356-->0x164

6.二进制与十六进制的转换

(1)二进制转十六进制

  1. 规则:低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
  2. 案例:请将1011011转成十六进制。

0101-->5    1011-->11-->B

0B1011011-->0X5B

(2)十六进制转二进制

  1. 规则:将十六进制数每1位,转成对应的4位的一个二进制数即可。
  2. 案例:请将0x23B转成二进制。

2-->0010  3-->0011  B-->1011     0x23B-->0b1000111011

二、原码、反码、补码

计算机底层存储数据时使用的是二进制数字,但是计算机在存储一个数字时并不是直接存储该数字对应的二进制数字,而是存储该数字对应二进制数字的补码。

  1. 正数的原码、反码、补码都一样,三码合一。
  2. 负数的反码:它的原码符号位不变,其它位取反(0 -> 1,1 -> 0);负数的补码:它的反码+1。
  3. 0的反码、补码都是0.

例如:12  -12

12(三码合一)-12
原码0000 11001000 1100
反码0000 11001111 0011(原码取反)
补码0000 11001111 0100(反码+1)

计算机内部的计算过程是用补码解决的。

三、数据类型

1.整型

(1)关于存储大小单位:

bit(位):计算机中的最小存储单位,表示一个二进制位。

byte(字节):计算机中基本存储单元,1byte = 8bit。

(2)注意事项:

  1. 类型存储大小受到操作系统、编译器、硬件平台的影响。
  2. 整型分为有符号signed和无符号unsigned两种,默认是signed。
  3. 开发中使用整型一般用int型,如果不足以表示大数,可以使用long long。

(3)字面量后缀:

int num = 123;

long num1 = 123L;

long long num2 = 123LL;

unsigned long num3 = 123UL;

unsigned long long num4 = 123ULL;

(4)格式占位符

  1. %d 对应 int 类型,%u 对应 unsigned int 类型。
  2. %hd 对应 short 类型,%hu 对应 unsigned short 类型。
  3. %ld 对应 long 类型,%lu 对应 unsigned long 类型。
  4. %lld 对应 long long 类型,%llu 对应 unsigned long long 类型。

代码演示:

#include <stdio.h>

int main()
{
    // short 类型
    short a1 = 10;  // 等同于 signed short a1 = 10;
    short a2 = -10; // 等同于 signed short a1 = -10;
    // unsigned short a3 = -20;
    unsigned short a3 = 20;
    printf("a1=%d; a2=%d; a3=%d \n", a1, a2, a3); // a1=10; a2=-10; a3=20

    // int 类型
    int b1 = 100;  // 等同于 signed int a1 = 100;
    int b2 = -100; // 等同于 signed int a1 = -100;
    unsigned int b3 = 200u;
    unsigned b4 = 300U;                                      // 等同于  unsigned int b4 = 300U;
    printf("b1=%d; b2=%d; b3=%d; b4=%d \n", b1, b2, b3, b4); // b1=100; b2=-100; b3=200; b4=300

    // long 类型
    long c1 = 1000l;   // 等同于 signed long c1 = 1000l;
    long c2 = -1000L; // 等同于 signed long c2 = -1000L;
    unsigned long c3 = 2000ul;
    printf("c1=%ld; c2=%ld; c3=%ld \n", c1, c2, c3); // c1=100; c2=-1000; c3=2000

    // long long 类型
    long long d1 = 10000ll;  // 等同于 signed long long d1 = 10000ll;
    long long d2 = -10000LL; // 等同于 signed long long d2 = -10000LL;
    unsigned long long d3 = 20000ULL;
    printf("d1=%lld; d2=%lld; d3=%lld \n", d1, d2, d3); // d1=10000; d2=-10000; d3=20000

    return 0;
}

输出结果:

a1=10; a2=-10; a3=20

b1=100; b2=-100; b3=200; b4=300

c1=100; c2=-1000; c3=2000

d1=10000; d2=-10000; d3=20000

2.浮点类型

(1)浮点数的类型

(2)浮点型注意事项

(3)字面量后缀

浮点数字面量默认double型,float num = 123f/123F,long double num1 = 123 L

(4)格式占位符

double类型的,输入必须是%lf,输出可以是%f,也可以是%lf.

float类型的,都是%f.

long double 类型输入输出必须是%LF.

%.2f表示输出值保留两位小数。

%e 对应科学计数法表示的浮点数,可以指定尾数部分所保留的小数位数,如 %.2e 表示尾数部分保留两位小数。

代码演示:

#include <stdio.h>

int main()
{
    // double 类型
    double a1 = 3.1415;
    double a2 = .12345678;
    double a3 = -2e12;
    double a4 = 1.9823e2;
    printf("a1=%f, a2=%.10f, a3=%.2lf, a4=%lf \n", a1, a2, a3, a4);
    printf("a1=%e, a2=%.2e, a3=%e, a4=%e \n", a1, a2, a3, a4);

    // float 类型
    float b1 = 3.1415f;
    float b2 = .123456f;
    float b3 = -2e12f;
    float b4 = 1.9823e2f;
    printf("b1=%f, b2=%f, b3=%.0f, b4=%f \n", b1, b2, b3, b4);
    printf("b1=%e, b2=%.2e, b3=%e, b4=%e \n\n", b1, b2, b3, b4);

    return 0;
}

输出结果为:

a1=3.141500, a2=0.1234567800, a3=-2000000000000.00, a4=198.230000

a1=3.141500e+00, a2=1.23e-01, a3=-2.000000e+12, a4=1.982300e+02

b1=3.141500, b2=0.123456, b3=-1999999991808, b4=198.229996

b1=3.141500e+00, b2=1.23e-01, b3=-2.000000e+12, b4=1.982300e+02

3.字符类型

char类型,占1字节。表示单个字符,比如数字、字母、符号。

格式占位符:%c

字符的本质是数字。

常用转义字符:

ASCII(American Standard Code for Information Interchange)码是一种用于表示文本字符的字符编码标准,一共规定了128个字符的编码,只需要记住A对应的数字是65,a对应的数字是97,中间的数字都可推导。例如B是66,b是98.

代码演示:

4.布尔类型

布尔值用于表示真、假两种状态,通常用于逻辑运算和条件判断。

(1)声明布尔类型的三种方式

<1>C89标准没有定义布尔类型,判断真假时以0为假,非0为真 ,但这种做法不直观,我们一般需要借助C语言的宏定义。

条件为假,不输出条件语句。

<2>C99标准提供了_Bool 型,_Bool仍是整数类型,但与一般整型不同的是,_Bool变量只能赋值为0或1,非0的值都会被存储为1。

代码演示:

<3>C99标准还提供了一个头文件 <stdbool.h> 定义了bool代表_Bool,true代表1,false代表0。

代码演示:

四、今日小测

1.将十进制数 42 转换为二进制表示。

2.将二进制数 110110 转换为十进制表示。

3.将二进制数 1101 转换为十六进制表示。

4.将十六进制数 1A3 转换为二进制表示。

5.有十进制数-8,请用八位二进制小数表示的它的原码、反码、补码

6.请将下列数据类型按照所占字节多少从小到大排序

long long、char、int、short

7.【代码题】写出下面代码的运行结果

#include <stdio.h>

int main()

{

    int a = 10;

    _Bool b1 = -4;

    printf("%d", a + b1);

    return 0;

}

答案:

1.  101010

2.  54

3.  D

4.  000110100011 或者 110100011

5.  原码:10001000     反码:11110111     补码:11111000

6.char(1字节)short(2字节)、int(4字节)、long long(16字节)

7.  11     C99标准提供了_Bool 型,_Bool仍是整数类型,但与一般整型不同的是,_Bool变量只能赋值为0或1,非0的值都会被存储为1。

  • 19
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值