嵌入式C语言深入篇之 —— 数据类型

了解硬件和更多资料可点击:点击了解

新建一个物联网行业交流学习QQ群,感兴趣可加:928840648

=====CUT=====

数据类型

类型定义

C语言标准中,常用的类型如下表格:

类型

存储大小

取值范围

signed char

1 字节(Byte),8bits

-128 到 127

unsigned char

1 字节,8bits

0 到 255

short

2 字节,16bits

-32,768 到 32,767

unsigned short

2 字节,16bits

0 到 65,535

int

2/4 字节,16/32bits

-32,768 到 32,767 或

-2,147,483,648 到 2,147,483,647

unsigned int

2/4 字节,16/32bits

0 到 65,535 或 0 到 4,294,967,295

long

4 字节,32bits

-2,147,483,648 到 2,147,483,647

unsigned long

4 字节,32bits

0 到 4,294,967,295

float

4 字节,32bits

1.2E-38 到 3.4E+38

double

8 字节,64bits

2.3E-308 到 1.7E+308

bool

忽略

true/false

      然而在正常开发过程中,由于平台(主控芯片类型)不同,会导致我们使用的变量有位数的差异,比如表中的int在不同位(16位/32位)机的表现不同,因此我们需要一个抽象定义来解决这个跨平台问题:

实际使用类型

存储大小

打印符号

int8_t

1 字节(Byte),8bits

%d

uint8_t

1 字节,8bits

%u%c%x(16进制小写,%X大写)

int16_t

2 字节,16bits

%d

uint16_t

2 字节,16bits

%u%x

int32_t

4 字节,32bits

32位机器%ld,64位机器%d

uint32_t

4 字节,32bits

32位机器%lu,64位机器%u%x

int64_t

8 字节,64bits

32位机器%lld,64位机器%ld

uint64_t

8 字节,64bits

32位机器%llu,64位机器%lu

float

4 字节,32bits

%f

double

8 字节,64bits

%lf

bool

忽略

%d或%s

      这个抽象定义在Linux标准头文件已经实现,我们只需要在开发时包含一下头文件即可:#include <stdint.h>

bool类型需要包含另外一个头文件:#include <stdbool.h>

类型格式化

      在上一章节中我们理解了类型占用的空间,还有输出格式,但还是存在一些困惑的地方,这里做一些解释,首先是格式输出(比如使用printf打印),我们必须要解决一个不同位数机器的兼容问题,在我们的Ubuntu Server中可以找到一个目录:~/workspace/basics/c/3_1_typedef,该目录里面的源码对应本章内容,如下: 

      

  1. 包含标准头文件:

      

说明:定义__cplusplus说明是c++的编译器进行编译,c++原生支持bool类型,因此可以忽略该头文件,不然会有编译告警。

  1. 定义变量:

      

  1. printf格式化输出:

      

说明:

#if defined(__x86_64__) || defined(__aarch64__) || defined(__arm64__)

      这段宏定义是在区分代码是在64位机器上还是32位机器,不同位数的打印输出是不一样的,我们的Ubuntu Server是64位机器的;如果没有这段宏,代码会出莫名其妙的运行时问题,而且是令人百思不得其解的现象。

  1. 编译及运行:

      注意,嵌入式的开发过程不要使用微软的工具(比如VS)来编译或者运行,不然你的代码会有一堆冗余的代码去将就WIN32和微软编译内核版本的问题,比如上述例子中的bool类型,如果使用旧的微软编译器(低于Visual Studio 2013的版本),一定会出现编译不通过的问题,而我们需要做一个修改来将就这个编译内核的问题:

     

      这种兼容在嵌入式开发是绝对的败笔,除非你的软件是开源软件,需要考虑各方的使用,如果是企业产品的开发,不建议使用微软的编译工具。

目前我们暂不考虑编译到开发板上运行,先通过gcc来编译测试:

      

这段代码可以在任何基于Linux平台(包括安卓)中被无缝移植,而且编译无任何警告和错误,运行也不会出现奇怪的问题。

这种格式化也经常被用来通过sprintf把数值格式化为字符串,比如:

       

       我们将程序放在RK的板子上运行,没有任何问题:

了解硬件和更多资料可点击:点击了解

新建一个物联网行业交流学习QQ群,感兴趣可加:928840648

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值