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

2024-01-07 19:24:30

开发环境:

  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布尔型(逻辑型)40-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)
字符10 ~ 255 或 0x00 ~ 0xFF%c
unsigned short
(uint16_t)
短整型20 ~ 65,535 或
0x00 ~ 0xFFFF
%u
unsigned int
(uint32_t)
整型40 ~ 4,294,967,295 或
0x00 ~ 0xFFFFFFFF
%u
unsigned long long
(uint64_t)
长长整型80 ~18,446,744,073,709,551,615 或
0x00 ~ 0xFFFFFFFFFFFFFFFF
%lld
long double12
10
16
暂无

暂无

符号位:1bit, 整数部分:16bit,
小数部分:111bit
%Lf 或 %lld 或 %llx

测试代码

#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;

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

(2)全局变量

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

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

(3)静态变量 (static)

定义:

  1. 局部变量和全局变量都可以作为静态变量。
  2. 不可被外部文件使用。
  3. 成为静态变量后,无法被删除,将永远存在。(不掉电的情况)
#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;

特点:① 常变量具有变量的属性,有类型,占存储单元,只是不允许修改值
???② 常变量在芯片的堆区。

#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只是临时变量
???②预编译后,符号所在的位置均变为符号常量的值

#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);
}

文章来源:https://blog.csdn.net/qq_29246181/article/details/135387950
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。