7月16日笔记C语言基础数据类型

本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型和字符串,以及它们的取值范围、内存占用和使用注意事项。此外,还提到了布尔型数据、常量与变量的区别以及标准输入的处理方法。着重阐述了如何定义和使用不同类型的整数,如short、long、long long以及无符号整型,并解释了浮点型(float、double、long double)的精度和取值范围。同时,字符和字符串的概念以及在内存中的存储也被提及。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 整型

  • 概念:表达整数类型的数据
  • 语法:

int a = 123; // 定义了一个专门用来存储整数的变量a

  • 需要注意的地方:
  1. int 的本意是 integer,即整数的意思
  2. int a 代表在内存中开辟一块小区域,称为 a,用来存放整数,a 一般被称为变量。
  3. 变量 a 所占内存大小,在不同的系统中是不一样的,64位系统典型的大小是4个字节。
  4. 变量 a 有固定的大小,因此也有取值范围,典型的范围是:-2147483648到2147483647
  • 整型修饰符
    • short:用来缩短整型变量的尺寸,减少取值范围并节省内存,称为短整型
    • long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长整型
    • long long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长长整型
    • unsigned:用来去除整型变量的符号位,使得整型变量只能表达非负整数

short int a; // 短整型

long int b;  // 长整型

long long int c; // 长长整型

unsigned int e;  // 无符号整型

unsigned short int f; // 无符号短整型

unsigned long int g;  // 无符号长整型

unsigned long long int h; // 无符号长长整型

  • 使用整型修饰符后,关键字 int 可以被省略

short a; // 短整型

long b;  // 长整型

long long c; // 长长整型

unsigned e;  // 无符号整型

unsigned short f; // 无符号短整型

unsigned long g;  // 无符号长整型

unsigned long long h; // 无符号长长整型

  • 符号位:
    • 有符号的整型数据,首位为符号位,0表示正数,1表示负数。2^31-1
    • 无符号的整形数据,没有符号位。2^32-1
  • 编码形式:
    • 原码:正数直接使用二进制来表达,比如a=100,在内存中是 00…001100100
    • 补码:负数用绝对值取反加一来表达,比如a=-3,在内存中是11…1111111101
    • 注意负数的补码在取反加一的时候,符号位是不动的
  • 溢出:
    • 超过数据所能表达的范围,称为溢出,就像汽车里程表,最大值和最小值是相邻的
  • 进制:源码中可以使用八进制、十进制或十六进制,但实际数据在内存中一律是二进制
    • 十进制(默认),比如1099
    • 八进制,比如013
    • 十六进制,比如0x6FF0A
  • 格式控制符
    • int 整型:%d
    • short 整型:%hd, h代表half,即一半的存储字节
    • long 整型:%ld
    • long long 整型:%lld
    • 显示不同进制的前缀: %#o、 %#x

2. 浮点型

  • 概念:用来表达实数的数据类型
  • 分类:
    • 单精度浮点型(float),典型尺寸是4字节
    • 双精度浮点型(double),典型尺寸是8字节
    • 长双精度浮点型(long double),典型尺寸是16字节
    • 占用内存越多,能表达的精度越高

float f1 = 3.1415926; // 单精度

Printf(%.3f\n,f1); // 3.142 ,四舍五入

double f2; // 双精度

long double f3; // 长双精度

浮点类型

最小精度

最大数值

float

10^{-37}10−37

10^{38}1038

double

10^{-307}10−307

10^{308}10308

long double

10^{-4931}10−4931

10^{4932}104932

3. 字符 字符是用’’单引号描述

char ch1 = 'a';  // 'a'是字符常量,代表字母a

char ch2 = '\n'; // '\n'是不可见字符常量,代表回车

计算机中存储的都是1和0,因此各种字符都必须被映射为某个数字才能存储到计算机中,这种映射关系形成的表称为 ASCII 码表。

字符本质上就是一个单字节的整型,支持整型所有的运算。比如:

char c1 = 20;

char c2 = c1 + 'a'; // 等价于 char c2 = 20 + 97;

printf("%c\n", c2); // 以字符形式输出117,即 'u'

printf("%d\n", c2); // 以整型形式输出117

4. 字符串  字符串是用双引号

  • 定义

// 字符串的定义方式有两种:指针和数组

char *s1 = "abcd"; // 使用字符指针来表示字符串

char s2[]= "abcd"; // 使用字符数组来表示字符串

注意:所有类型(char * || int*||float *||double *)的指针在32位系统都是占用4字节,在64位系统是占用8字节

// 注意,使用数组来定义字符串时,方括号[]里面的数字可以省略

// 不省略也可以,但必须必字符串实际占用的内存字节数要大,比如:

char s3[] = "apple";

  • 在内存中的存储
    • 在内存中实际上是多个连续字符的组合
    • 任何字符串都以一个 ‘\0’ 作为结束标记,例如:“funny story” 的内存如下

5. 布尔型数据

头文件:#include <stdbool.h>

  • 概念:布尔型数据只有真、假两种取值,非零为真,零为假。
  • 语法:

bool a = 1; // 逻辑真,此处1可以取其他任何非零数值

bool b = 0; // 逻辑假

  • 注意:
  1. 逻辑真除了 1 之外,其他任何非零数值都表示逻辑真,等价于 1。
  2. 使用布尔型 bool 定义变量时需要包含系统头文件 stdbool.h。
  • 布尔型数据常用语逻辑判断、循环控制等场合。

6. 常量与变量

  • 概念:不可改变的内存称为常量,可以改变的内存称为变量
  • 举例:

int a = 100;    // a是变量,而100是常量

float f = 3.14; // f是变量,而3.14是常量

char s[] = "abcd"; // s是变量,"abcd"是常量

  • 常量的类型

常量举例

说明

类型

100

整型

int

100L

长整型

long

100LL

长长整型

long long

100ULL

无符号长长整型

unsigned long long

3.14

双精度浮点型

double

3.14L

长双精度浮点型

long double

‘a’

字符型

char

“abcd”

字符指针(字符串)

char *

7. 标准输入

  • 概念:键盘是系统的标准输入设备,从键盘中输入数据被称为标准输入
  • 相关函数:

man -f scanf

man 3 scanf

scanf(); // 格式化输入函数

fgets(); // 字符串输入函数

int a;

float f;

scanf("%d", &a);   // 从键盘输入一个整型,放入指定的内存地址 &a 中

scanf("%f", &f);   // 从键盘输入一个浮点数,放入指定的内存地址 &f 中

scanf("%d%f", &a, &f); // 从键盘依次输入一个整型和一个浮点型数据,用空白符隔开

char c;

char s[10];

scanf("%c", &c);  // 从键盘输入一个字符,放入指定的内存地址 &f 中

scanf("%s", s );  // 从键盘输入一个单词,放入指定的数组 s 中(注意不是&s)

fgets(s, 10, stdin); // 从键盘输入一行字符串,放入数组 s 中

  • 注意1:
    • scanf() 与 printf() 不同,scanf() 的格式控制串不可乱写,尤其是结尾处的 \n
    • 用户必须完全按照 scanf() 中描述的输入格式控制串来输入数据,否则将出错。
    • 示例:

// 此处输入时必须带逗号

scanf("%d,%d", &a, &b);

// 此处必须先输入a=,然后才能输入整数

scanf("a=%d", &a);

// 此处结束输入时按下的回车符将被scanf()误以为格式控制符,无法正常结束输入

scanf("%d\n", &a);

  • 注意2:
    • scanf() 的返回值,代表成功从键盘读取的数据的个数
    • 无法匹配 scanf() 指定格式的数据,将被遗留在输入缓冲区中,不会消失
    • 示例:

// scanf() 试图从键盘读取两个整数

// 返回值 n 代表成功读取的个数,比如:

// 输入100 200,则 n 将等于2

// 输入100 abc,则 n 将等于1

// 输入abc xyz,则 n 将等于0;输入abc 200,n也将等于0

int n = scanf("%d%d", &a, &b);

// 根据 scanf() 的返回值,判断用户是否输入了正确的格式

while(n != 2)

{

    // 需要清空缓冲区并提示用户重新输入

    char s[50];

    fgets(s, 50, stdin);

    printf("请重新输入两个整数\n");

    n = scanf("%d%d", &a, &b);

}

scanf的输入判断,判断是否输入正确,存在小毛病。

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <stdbool.h>
int main()
{
	int a,b;
	int i=0;
	printf("%d\n",k);
	printf("请先输入两个整数:\n");
	int ret=scanf("%d%d",&a,&b);
	while(ret !=2)
	{
		//int i=1;
		i++;
		char buf[50];
		fgets(buf,50,stdin);
		printf("buf=%s\n",buf);
		printf("i=%d\n",i);
		printf("请重新输入两个整数:\n");
		ret=scanf("%d%d",&a,&b);
		//int i=1;
		//i++;
		if(i>=5)
		{
			ret=2;
			printf("重复输入5次,输入失败!");
		}
	}
	printf("ret=%d\n",ret);
	printf("a=%d,b=%d\n",a,b);
    
    
    return 0;
    
}

<think>好的,用户指出之前的分析时间上有误,现在需要重新调整计划。首先我得确认之前的错误,用户原本提到要在2025年8月找工作,但之前的规划用了18个月,显然时间计算错误。用户现在指出距离目标还有5个月,也就是到8月只有5个月的时间,而不是之前的18个月。这说明用户可能比较着急,需要更紧凑的学习计划。 接下来,我需要重新评估用户的情况。用户是2024年毕业,工作了一年,但在小微企业没学到太多东西,基础薄弱。现在希望在5个月内提升技能,找到更好的嵌入式相关工作。时间紧迫,所以必须制定高效的短期计划。 首先,用户的目标是嵌入式软硬件相关职位,需要明确哪些技能是短期内可以提升的,并且对求职有直接帮助。嵌入式领域涉及软件开发、硬件设计、IoT、汽车电子等方向,但时间有限,可能需要选择一个方向重点突破。 需要分析各个岗位的核心技能,然后筛选出能在5个月内掌握的关键点。比如,嵌入式软件开发可能需要C语言、RTOS、驱动开发;硬件设计可能需要PCB设计、电路分析;IoT可能需要通信协议和云平台对接;汽车电子可能需要CAN总线、AUTOSAR等。 考虑到用户已有1年经验,虽然基础薄弱,但了解行业流程,可以结合现有经验选择相关方向。例如,如果用户在工作中接触过硬件设计,可能更适合继续深入硬件方向,反之则选软件方向。 另外,城市选择也很重要。不同城市的产业聚集不同,比如深圳的消费电子、苏州的汽车电子、杭州的IoT等。需要根据岗位方向推荐合适的城市,并预估薪资水平。 认证方面,短期内可能无法考取多个证书,所以需要推荐含金量高且备考时间短的认证,比如ARM的CAE认证,或者华为的HCIA-IoT。 学习资源方面,需要推荐高效的学习材料和项目,例如在线课程、开发板、书籍等,帮助用户快速提升实战能力。 最后,时间规划必须紧凑,分阶段进行,每个阶段重点突破某些技能,并完成项目实战,以在求职时展示能力。同时,简历和面试准备也需要提前安排,确保在8月前准备好所有材料。 总结下来,用户需要的是一个5个月的详细学习计划,分阶段强化基础、专项突破、项目实战,结合目标岗位和城市,推荐相关资源和认证,并在求职策略上给予指导。需要确保计划切实可行,时间安排合理,重点突出,帮助用户在短时间内最大程度提升竞争力。</think>根据时间修正(当前2025年2月26→目标2025年8月,共5个月),重新制定加速提升方案: # 一、紧急能力缺口分析 $$\text{关键缺口} = \underbrace{\text{项目闭环能力}}_{\text{最大短板}} + \underbrace{\text{岗位匹配技能}}_{\text{突破口}}$$ # 二、5个月学习路线图(2025.3-2025.7) ## 阶段1:核心技能速成(第1-2月) ```mermaid flowchart TD A[每必修] --> B[上午2小时:C语言强化] A --> C[下午3小时:STM32开发] A --> D[晚上2小时:项目复盘] B --> B1[指针操作/内存管理] B --> B2[数据结构嵌入式实现] C --> C1[HAL库开发] C --> C2[外设驱动开发] D --> D1[现有项目逆向分析] D --> D2[开发志重构] ``` **关键指标**: - 掌握$\geq 5种$常用外设驱动开发(ADC/SPI/I2C/PWM/CAN) - 能独立完成$\text{基于FreeRTOS的多任务系统搭建}$ ## 阶段2:岗位定向突破(第3-4月) ### 岗位技能矩阵 | 岗位类型 | 必须掌握技能 | 推荐学习路径 | |----------------|--------------------------------------|-----------------------------------------------------------------------------| | 嵌入式软件 | RTOS/通信协议/Linux基础 | STM32CubeIDE+FreeRTOS→移植LWIP协议栈 | | 硬件工程师 | 四层板设计/EMC整改 | Altium Designer→完成2个实际项目改版设计 | | 汽车电子 | CAN总线/UDS诊断 | CANalyzer实操→开发OBD-II诊断工具 | | IoT开发 | MQTT/边缘计算 | ESP32+阿里云平台→实现远程温控系统 | **实战要求**: - 每个方向完成$\text{1个完整项目}$并部署到GitHub - 撰写$\text{详细开发文档}$(含调试记录) ## 阶段3:求职冲刺(第5月) $$\text{竞争力公式} = \left( \frac{\text{项目质量}}{\text{技术栈匹配度}} \right) \times \text{面试准备指数}$$ **关键动作**: 1. 开发3个$\text{可演示作品}$(推荐使用$\text{立创EDA}$开源硬件平台) 2. 构建$\text{技术博客}$(每月$\geq 4篇$实战笔记) 3. 参与$\text{电子发烧友论坛}$技术讨论(建立行业人脉) # 三、城市机会与技能匹配 ```python # 优先级计算公式(根据你的背景) def city_priority(city): skill_match = job_data[city]['skill_overlap'] salary_ratio = job_data[city]['avg_salary'] / living_cost[city] return 0.6*skill_match + 0.4*salary_ratio # 计算结果(降序排列): 1. 苏州(汽车电子/工业控制)→ 薪资竞争力指数82 2. 东莞(硬件设计/制造)→ 成本收益比78 3. 武汉(光通信/IoT)→ 人才政策加分 ``` # 四、学习资源聚焦 1. **硬件设计**:在$\text{嘉立创开源平台}$复刻经典项目(如$\text{STM32最小系统板}$) 2. **软件开发**:参加$\text{全国大学生嵌入式竞赛}$企业组(截止2025.5报名) 3. **协议栈**:精读$\text{Modbus协议规范}$(v1.0b中文版) # 五、认证取舍建议 $$\text{认证价值} = \frac{\text{行业认可度}}{\text{时间成本}}$$ - 首选:$\text{华为HCIA-IoT}$(备考时间≤3周,通过率68%) - 次选:$\text{优快云嵌入式能力认证}$(可快速获得) # 六、每学习模板 ```markdown 07:30-08:30 电子工程世界早报(行业动态) 09:00-11:30 STM32实战开发(外设+协议栈) 14:00-16:00 硬件设计训练(立创EDA) 19:30-21:30 技术博客撰写/项目文档整理 21:30-22:30 嵌入式面经刷题(牛客网) ``` # 七、风险控制方案 1. **技术深度不足**:选择$\text{细分领域}$集中突破(如专注$\text{电机控制算法}$) 2. **项目经验单薄**:参与$\text{极术社区}$的联合开发项目 3. **简历竞争力弱**:采用$\text{STAR法则}$重构工作经历 **关键时间节点**: - 2025.4.15前完成$\text{2个可展示项目}$ - 2025.6.1启动$\text{模拟面试}$(推荐使用$\text{面试巴巴}$AI系统) - 2025.7.15前建立$\geq 50家$目标企业清单 建议重点发展$\text{垂直领域专精能力}$,例如在$\text{电机控制}$方向形成技术标签,通过$\text{GitHub提交记录}$和$\text{技术博客}$构建个人品牌。小微企业背景可突出$\text{全栈实践能力}$和$\text{快速响应优势}$。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值