[嵌入式C][入门篇] 快速掌握基础2 (数据类型、常量、变量)

开发环境:

  1. 网页版:跳转
  2. 本地开发(Vscode):跳转

文章目录

一、基本变量大小和范围

(1)在8位/32位单⽚机中:

名称 中文名 大小(byte) 范围 格式化符号 (<4byte的都可以使用%d)
char 字符 1 -128 ~ 127 %c
short 短整型 2 -32768 ~ 32767 %d
int 整型 4 -2147483648 ~ 2147483647 %d
long 长整型 4 -2147483648 ~ 2147483647 %ld
bool 布尔型(逻辑型) 4 0-1 %u
float 单精度浮点型 4 符号位:1bit, 整数部分:8bit, 小数部分:23bit %f
double 双精度浮点型 8 符号位:1bit, 整数部分:11bit, 小数部分:52bit %lf
long long 长长整型 8 -9223372036854775808~ 9223372036854775807 %lld
enum 枚举型 4(可调整为1) %d
struct 结合体型 可变 (根据成员计算) %u
union 联合体型 可变 (根据成员计算) %u
* 指针型 4 %u 或者 %x
unsigned 无符号 --- -------------- ---------------
unsigned char (uint8_t) 字符 1 0 ~ 255 或 0x00 ~ 0xFF %c
unsigned short (uint16_t) 短整型 2 0 ~ 65,535 或 0x00 ~ 0xFFFF %u
unsigned int (uint32_t) 整型 4 0 ~ 4,294,967,295 或 0x00 ~ 0xFFFFFFFF %u
unsigned long long (uint64_t) 长长整型 8 0 ~18,446,744,073,709,551,615 或 0x00 ~ 0xFFFFFFFFFFFFFFFF %lld
long double 12 10 16 --- 暂无 --- 暂无 --- 符号位:1bit, 整数部分:16bit, 小数部分:111bit %Lf 或 %lld 或 %llx

测试代码

c 复制代码
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
enum {
	ONE = 1,
}num_t;

typedef struct { // 字节对齐,按最大成员字节转换
	uint8_t a; // 编译器强制转换为uint16_t
	uint16_t b;
}xjq_t;

typedef union { // 
	uint8_t buff[8]; // 如果buff>pack,则以此为准,8byte
	struct {
		uint8_t a;  // 1 byte
		uint16_t b; // 2 byte
		uint32_t c; // 4 byte
		uint32_t d; // 4 byte
	}pack; // 共计 11字节, 编译对齐后,12byte
}lisun_t;

int main () { // \t 代表tab
	printf("char:\t%d byte\r\n", sizeof(char));
	printf("short:\t%d byte\r\n", sizeof(short));
	printf("int:\t\t%d byte\r\n", sizeof(int));
	printf("long:\t%d byte\r\n", sizeof(long));
	printf("bool:\t%d byte\r\n", sizeof(bool));
	printf("float:\t%d byte\r\n", sizeof(float));
	printf("double:\t%d byte\r\n", sizeof(double));
	printf("long long:\t%d byte\r\n", sizeof(long long));
	printf("\r\n");
	printf("enum:\t%d byte\r\n", sizeof(num_t));
	printf("struct:\t%d byte\r\n", sizeof(xjq_t));
	printf("union:\t%d byte\r\n", sizeof(lisun_t));
	printf("\r\n");
	printf("uint8_t:\t%d byte\r\n", sizeof(uint8_t));
	printf("uint16_t:\t%d byte\r\n", sizeof(uint16_t));
	printf("uint32_t:\t%d byte\r\n", sizeof(uint32_t));
	printf("uint64_t:\t%d byte\r\n", sizeof(uint64_t));
	long double test = 0xFFFFFFFFFFFFFFFFull;
	printf("long double:\t%d byte, Max:%Lf\r\n", sizeof(long double), test);
}

结果:64位机器

结果:32位机器(单片机)无对齐限制

二、 局部变量 全局变量 静态变量 常量

特点:① 有变量名,变量值,有类型,占存储单元

② 变量名是一个存储地址

(1)局部变量

定义: 局部变量函数中定义的变量。函数执行完毕后,变量自动删除。

使用方式:int a = 3;

c 复制代码
#include <stdio.h>
#include <stdint.h>
int main () {
	uint8_t test = 8; // 局部变量
	while(1);
}

(2)全局变量

定义:在函数外定义的变量就是全局变量。全局变量不会被删除。可以被外部文件使用。

c 复制代码
#include <stdio.h>
#include <stdint.h>
uint8_t g_test = 8; // 全局变量
int main () {
	while(1);
}

(3)静态变量 (static)

定义:

  1. 局部变量和全局变量都可以作为静态变量。
  2. 不可被外部文件使用。
  3. 成为静态变量后,无法被删除,将永远存在。(不掉电的情况)
c 复制代码
#include <stdio.h>
#include <stdint.h>
static uint8_t g_test = 8; // 静态全局变量
int main () {
	static uint8_t test = 8; // 静态局部变量 (这样的定义等同静态全局变量)
	while(1);
}

(4)常量 (const)

使用方式:const int a=3;

特点:① 常变量具有变量的属性,有类型,占存储单元,只是不允许修改值

② 常变量在芯片的堆区。

c 复制代码
#include <stdio.h>
#include <stdint.h>
const uint8_t g_test = 8; // 全局常量 (全部函数均可使用)
int main () {
	const uint8_t test = 8; // 局部常量 (作用域仅限本函数)
	while(1);
}

宏定义也可以定义常量(#define)

使用方式:#define PI 3.1416

特点:① 对符号常量的名字是不分配存储单元,PI只是临时变量

②预编译后,符号所在的位置均变为符号常量的值

c 复制代码
#include <stdio.h>
#include <stdint.h>
#define  PI  3.1416
const uint8_t g_test = PI; // 全局常量 (全部函数均可使用)
int main () {
	const uint8_t test = PI; // 局部常量 (作用域仅限本函数)
	while(1);
}
相关推荐
liu_chunhai9 分钟前
设计模式(3)builder
java·开发语言·设计模式
姜学迁17 分钟前
Rust-枚举
开发语言·后端·rust
冷白白19 分钟前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
凌云行者23 分钟前
rust的迭代器方法——collect
开发语言·rust
It'sMyGo26 分钟前
Javascript数组研究09_Array.prototype[Symbol.unscopables]
开发语言·javascript·原型模式
睡觉然后上课37 分钟前
c基础面试题
c语言·开发语言·c++·面试
qing_04060344 分钟前
C++——继承
开发语言·c++·继承
武昌库里写JAVA44 分钟前
【Java】Java面试题笔试
c语言·开发语言·数据结构·算法·二维数组
小叶学C++1 小时前
【C++】类与对象(下)
java·开发语言·c++
ac-er88881 小时前
PHP“===”的意义
开发语言·php