常量、二进制、数据类型从入门


前言

在上一篇文章中,我们一起学习了C语言基础的输入输出、变量定义与使用,以及新手最容易踩的各类语法坑。随着学习的深入,我们来到了C语言最核心、也最容易被忽略的基础部分:常量、二进制与数据类型

很多初学者觉得这部分内容枯燥、简单,不愿意认真学,可真正写代码时才发现:90%的诡异Bug,都来自数据类型、溢出、符号位、精度、常量定义这些基础细节

这篇文章我将用最直白、最系统的方式,带你一次性吃透这些知识点,同时把新手最容易踩的坑全部扒干净。无论是准备学嵌入式,还是正在打C语言基础,这篇都非常适合你。


第4章 常量

4.1 什么是常量
在程序运行过程中,值不可以被改变的量称为常量。

例如:圆周率 PI、最大允许年龄、固定配置参数、设备地址等,一旦定义就不希望被修改。

4.2 常量的分类
C语言中常量主要分为两类:

  1. 字面常量:直接写在代码中的固定值,如 1003.14'A'
  2. 标识符常量:用名称表示的常量,方便阅读与统一修改。

4.3 #define 定义常量
#define 是预处理指令,在编译前进行纯文本替换

语法

#define 常量名 常量值  

示例

#include <stdio.h>  
#define PI 3.14  

int main() {  
    double r = 2.0;  
    double area = PI * r * r;  
    printf("面积 = %.2f\n", area);  
    return 0;  
}  

注意事项

  • 不能加分号,加分号会被当作常量内容一起替换,导致语法错误。
  • 作用域从定义开始到文件结束。
  • 不进行类型检查,仅做文本替换。

4.4 const 定义常量
const 是类型安全的常量定义方式,属于C语言标准语法。

语法

const 数据类型 常量名 = 值;  

示例

#include <stdio.h>  
const double PI = 3.14;  

int main() {  
    double r = 2.0;  
    double area = PI * r * r;  
    printf("面积 = %.2f\n", area);  
    return 0;  
}  

特点

  • 有数据类型,编译器会做类型检查。
  • 有地址、占用内存,更安全。
  • 不能被修改,修改会直接报错。

4.5 #define 与 const 的区别

  • #define:预处理阶段文本替换,无类型、不安全、不占内存。
  • const:编译阶段处理,有类型、安全、占用内存。
  • 嵌入式开发建议优先使用 const

第5章 二进制与进制转换

5.1 为什么要学二进制
计算机底层只识别 0 和 1,所有数据最终都以二进制存储。
掌握二进制是理解数据存储、溢出、位运算、内存、嵌入式寄存器的第一步

5.2 常用进制表示

  • 二进制:0、1,以 0b 开头
  • 十进制:0~9,日常使用
  • 十六进制:0~9、A~F,以 0x 开头,程序员最常用

5.3 C语言中进制写法

int a = 10;        // 十进制  
int b = 0b1010;    // 二进制  
int c = 0xA;       // 十六进制  

5.4 进制转换规则
二进制 → 十进制
按权展开求和。

例:1011 = 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 11

十进制 → 二进制
除2取余,逆序排列。

二进制 ↔ 十六进制

  • 4位二进制 = 1位十六进制
  • 从低位开始分组,一组4位

5.5 原码、反码、补码
计算机存储负数必须用补码

规则

  • 正数:原码=反码=补码
  • 负数
    1. 原码:最高位符号位为1
    2. 反码:符号位不变,其余取反
    3. 补码:反码 + 1

作用
统一正负号运算规则,让计算机只用加法就能完成减法运算。


第6章 数据类型

6.1 数据类型的作用
不同数据类型占用不同大小的内存,能存储的数据范围不同。
合理选择类型可以节省内存、避免溢出、提高效率。

6.2 整数类型
常用整型

  • char:1字节
  • short:2字节
  • int:4字节
  • long:4/8字节
  • long long:8字节

有符号与无符号

  • signed:可正可负(默认)
  • unsigned:只能存正数与0,范围扩大一倍

例:

  • char:-128 ~ 127
  • unsigned char:0 ~ 255

嵌入式常用精确类型

#include <stdint.h>  
int8_t   // 8位有符号  
uint8_t  // 8位无符号  
int32_t  // 32位有符号  
uint32_t // 32位无符号  

6.3 浮点类型
用于存储小数。

类型

  • float:4字节
  • double:8字节(默认)
  • long double:16字节

注意

  • 浮点字面量默认是 double
  • float 必须加后缀 f,如 3.14f

6.4 字符类型 char
char 本质是 1字节整数,存储 ASCII 码。

char ch = 'A';  
printf("%c\n", ch);  // 输出字符  
printf("%d\n", ch);  // 输出 ASCII 码 65  

6.5 数据大小获取 sizeof

printf("%d\n", sizeof(int));  
printf("%d\n", sizeof(double));  


    新手高频踩坑总结(必读)
  1. #define 后面加分号 → 编译报错
  2. 修改 const 常量 → 直接报错
  3. 整数溢出 → 数值异常、变负数
  4. unsigned 与 signed 混用 → 比较结果异常
  5. 浮点数用 == 判断相等 → 精度问题导致错误
  6. scanf 输入 double 用 %f → 必须用 %lf
  7. char 当做整数运算 → 结果超出预期
  8. 二进制/十六进制前缀写错 → 编译失败

总结

C语言的强大,不在于语法多复杂,而在于对数据和内存的精确掌控
常量、二进制、数据类型看似基础,却是嵌入式开发、底层开发的重中之重

把这一章学扎实,你未来写代码会少踩90%的坑。

我是一名从零开始冲击嵌入式的小白,持续分享最真实、最干货的从零入门笔记。
下篇我们继续学习:运算符、表达式与流程控制

欢迎关注,一起成长!


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐