在C语言中,数据初始化是指在声明变量或数组的同时为其赋予初始值的过程。正确的初始化可以提高程序的可读性和可靠性,避免未初始化变量带来的问题。

类型 | 符号性 | 取值范围 | 格式化说明符 |
|---|---|---|---|
char | 实现定义 | 通常为-128到127或0到255 | %c |
signed char | 有符号 | -128到127 | %hhd |
unsigned char | 无符号 | 0到255 | %hhu |
char ch1 = 'A'; // 字符赋值
char ch2 = 65; // 等效于'A'的ASCII值
char ch3 = -5; // 可能合法,取决于编译器实现
printf("字符形式: %c\n", ch1); // 输出: A
printf("整数值: %hhd\n", ch2); // 输出: 65
printf("可能的有符号值: %hhd\n", ch3); // 可能是-5C语言本身并没有字符串类型,我们在C语言程序中使用的字符串实际上是字符数组,即多个字符构成的就是字符串!
数据类型 | 存储大小 | 取值范围 (有符号) | 取值范围 (无符号) | 格式化说明符 |
|---|---|---|---|---|
unsigned char | 1 字节 | - | 0 到 255 | %hhu |
short | 2 字节 | -32,768 到 32,767 | - | %hd |
unsigned short | 2 字节 | - | 0 到 65,535 | %hu |
int | 4 字节 (通常) | -2,147,483,648 到 2,147,483,647 | - | %d |
unsigned int | 4 字节 (通常) | - | 0 到 4,294,967,295 | %u |
long | 4 或 8 字节 | -2,147,483,648 到 2,147,483,647 (32 位)或更大 (64 位) | 0 到 4,294,967,295 (32 位)或更大 (64 位) | %ld |
unsigned long | 4 或 8 字节 | - | 0 到 4,294,967,295 (32 位)或更大 (64 位) | %lu |
long long | 8 字节 | -9,223,372,036,854,775,808到 9,223,372,036,854,775,807 | - | %lld |
unsigned long long | 8 字节 | - | 0 到 18,446,744,073,709,551,615 | %llu |
类型 | 存储大小 (通常) | 有效数字位数 | 取值范围 (近似) | 格式化说明符 |
|---|---|---|---|---|
float | 4字节 (32位) | 6-7位 | ±1.18×10⁻³⁸ 到 ±3.4×10³⁸ | %f, %e, %g |
double | 8字节 (64位) | 15-16位 | ±2.23×10⁻³⁰⁸ 到 ±1.80×10³⁰⁸ | %lf, %le, %lg |
long double | 10/12/16字节 (实现相关) | 18-19位或更多 | 范围更大 (实现相关) | %Lf, %Le, %Lg |
float f = 3.14f; // f/F后缀表示float
double d = 3.14159; // 默认double类型
long double ld = 3.1415926535L; // L后缀表示long double
// 科学计数法
double sci = 1.23e-5; // 0.0000123(1) 精度问题
float a = 0.1f;
float b = 0.2f;
float c = a + b; // 可能不等于0.3,而是0.300000012(2)浮点类型强制转换 float -> double -> long double // 自动提升
浮点类型会与数学函数库<math.h>擦出许多亮丽的火花,后面会发篇文章讲解,敬请期待
_Bool flag = true;//true也可以是0或者非0
if(flag){
printf("I like China/n");
}#include <stdbool.h>%d:是打印布尔值的正确格式说明符,因为布尔值本质上是 int 类型。
代码示例
#include <stdio.h>
#include <stdbool.h>
int main() {
bool b = true;
printf("%d\n", b); // 输出 1
return 0;
}double > float > long long > long > int >short
数据类型的 大小size和长度length是两个相关但不同的概念
int x;
printf("%zu", sizeof(x)); // 输出:4(在32/64位系统中通常为4字节)常见类型的大小(可能因系统/编译器而异):
char:1 字节 int:通常 4 字节 float:通常 4 字节 double:通常 8 字节
定义:长度的含义更灵活,具体取决于数据类型:
数组/字符串:元素的数量(如字符数、数组元素数)。
动态结构(如列表、字符串):当前存储的元素个数(可能通过 .length 或 .size() 方法获取)。
int x;
printf("%zu", sizeof(x)); // 输出:4(在32/64位系统中通常为4字节)特性 | 大小(Size) | 长度(Length) |
|---|---|---|
关注点 | 内存占用(字节数) | 元素数量或逻辑长度 |
获取方式 | sizeof(静态类型) | .length/.size()/len() |
适用场景 | 内存管理、二进制操作 | 逻辑操作(如遍历、切片) |
// C 示例
int arr[5];
printf("Size: %zu\n", sizeof(arr)); // 输出:20(假设int为4字节,5*4=20)
printf("Length: %zu\n", sizeof(arr)/sizeof(int)); // 输出:5(元素数量)int main()
{
int a = 10;
short s = 4;
printf("%zd/n",sizeof(s = a + 5));
return 0;
}上述代码中,a是int类型(4字节),s是short类型(2字节),int类型放不下short类型,这时候就会发生截断
最终只会输出一个2
代码示例
#include <stdio.h>
#include <stddef.h> // 定义 size_t
int main() {
size_t size = sizeof(int); // sizeof 返回 size_t 类型
printf("Size of int: %zu bytes\n", size); // 正确:%zu 对应 size_t
size_t array_size = 10;
printf("Array size: %zu\n", array_size); // 正确
// 错误示例:如果用 %d 打印 size_t,可能导致警告或错误
// printf("Size of int (incorrect): %d\n", size); // 不推荐,可能截断数据
return 0;
}Size of int: 4 bytes
Array size: 10代码示例
#include <stdio.h>
#include <sys/types.h> // 定义 ssize_t(在类Unix系统中)
int main() {
ssize_t bytes_read = 1024; // 假设读取了 1024 字节
printf("Bytes read: %zd\n", bytes_read); // 正确:%zd 对应 ssize_t
ssize_t error_code = -1; // 某些函数(如 read())返回 -1 表示错误
printf("Error code: %zd\n", error_code); // 正确:可以输出负数
// 错误示例:如果用 %d 打印 ssize_t,在部分平台可能没问题,但可移植性差
// printf("Bytes read (incorrect): %d\n", bytes_read); // 不推荐
return 0;
}Bytes read: 1024
Error code: -1sizeof(int); // 通常为4
sizeof(char); // 总是1
sizeof(float); // 通常为4
sizeof(double); // 通常为8int arr[10];
sizeof(arr); // 返回整个数组的大小(10 * sizeof(int))
// 计算数组元素个数
int elements = sizeof(arr) / sizeof(arr[0]);//sizeof(arr[0]结果为0sizeof("hello"); // 返回6(包括终止的空字符'\0')后面随着学习内容的深入,会有越来越多关于sizeof的结合运用,敬请期待

当我们了解了整数在内存中存储后,我们调试看⼀个细节:

我们可以看到在a中的 0x11223344 这个数字是按照字节为单位,倒着存储的

这我们就得提到数据存储的大小端问题了


这不是编译器决定的,而是 CPU 架构的字节序决定的 小端序:低位字节存在低地址 大端序:高位字节存在低地址