首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >收集飞花令碎片——【C语言基本数据类型&&数据在内存中的存储】

收集飞花令碎片——【C语言基本数据类型&&数据在内存中的存储】

作者头像
枫亭湖区
发布2025-11-12 18:05:50
发布2025-11-12 18:05:50
150
举报

前提:数据类型的初始化

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

一、数据类型介绍

char数据类型

  • 介绍: char是C语言中最小的整数数据类型,也是唯一既属于整数类型又属于字符类型的数据类型。它可以记录整数、小数、字符

类型

符号性

取值范围

格式化说明符

char

实现定义

通常为-128到127或0到255

%c

signed char

有符号

-128到127

%hhd

unsigned char

无符号

0到255

%hhu

  • 每一种变量举例
代码语言:javascript
复制
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);  // 可能是-5

C语言本身并没有字符串类型,我们在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

代码语言:javascript
复制
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) 精度问题

代码语言:javascript
复制
float a = 0.1f;
float b = 0.2f;
float c = a + b;  // 可能不等于0.3,而是0.300000012

(2)浮点类型强制转换 float -> double -> long double // 自动提升

浮点类型会与数学函数库<math.h>擦出许多亮丽的火花,后面会发篇文章讲解,敬请期待

布尔类型

  • C语言中并没有为布尔值单独设置一个类型,而是使用整数0表示假,非0值表示真
代码语言:javascript
复制
_Bool flag = true;//true也可以是0或者非0
if(flag){
printf("I like China/n");
}
  • 使用布尔类型需要包含头文件<stdbool.h>
代码语言:javascript
复制
#include <stdbool.h>
  • 格式说明符

%d:是打印布尔值的正确格式说明符,因为布尔值本质上是 int 类型。

代码示例

代码语言:javascript
复制
#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是两个相关但不同的概念

1. 大小(Size)

  • 定义:数据类型的大小通常指该类型在内存中占用的字节数(由 sizeof 操作符或类似机制获取)。
  • 作用:帮助理解内存分配、优化存储或处理二进制数据(如文件、网络通信)。
代码示例
代码语言:javascript
复制
int x;
printf("%zu", sizeof(x)); // 输出:4(在32/64位系统中通常为4字节)

常见类型的大小(可能因系统/编译器而异):

char:1 字节 int:通常 4 字节 float:通常 4 字节 double:通常 8 字节

2. 长度(Length)

定义:长度的含义更灵活,具体取决于数据类型:

数组/字符串:元素的数量(如字符数、数组元素数)。

动态结构(如列表、字符串):当前存储的元素个数(可能通过 .length 或 .size() 方法获取)。

代码示例
代码语言:javascript
复制
int x;
printf("%zu", sizeof(x)); // 输出:4(在32/64位系统中通常为4字节)

3、关键区别

特性

大小(Size)

长度(Length)

关注点

内存占用(字节数)

元素数量或逻辑长度

获取方式

sizeof(静态类型)

.length/.size()/len()

适用场景

内存管理、二进制操作

逻辑操作(如遍历、切片)

代码示例
代码语言:javascript
复制
// 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(元素数量)

拓展:sizeof关键字

  1. 基本特性 sizeof用来计算操作符的类型长度,单位是字节 编译时求值:sizeof在编译时确定结果,不会在运行时计算
  2. 表达式
  • sizeof(类型)
  • sizeof 表达式;//如果sizeof后面是表达式是不参与真实的运算的,根据表达式的类型得出大小
代码语言:javascript
复制
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

  1. 返回值类型 %zu返回值类型(推荐使用)

代码示例

代码语言:javascript
复制
#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;
}
代码语言:javascript
复制
Size of int: 4 bytes
Array size: 10
  1. %zd用于 ssize_t(有符号类型)

代码示例

代码语言:javascript
复制
#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;
}
代码语言:javascript
复制
Bytes read: 1024
Error code: -1
  1. 应用举例
sizeof计算基本数据类型大小
代码语言:javascript
复制
sizeof(int);    // 通常为4
sizeof(char);   // 总是1
sizeof(float);  // 通常为4
sizeof(double); // 通常为8
sizeof计算数组大小
代码语言:javascript
复制
int arr[10];
sizeof(arr);    // 返回整个数组的大小(10 * sizeof(int))

// 计算数组元素个数
int elements = sizeof(arr) / sizeof(arr[0]);//sizeof(arr[0]结果为0
sizeof字符串字面量(重要)
代码语言:javascript
复制
sizeof("hello");  // 返回6(包括终止的空字符'\0')

后面随着学习内容的深入,会有越来越多关于sizeof的结合运用,敬请期待


三、数据在内存中存储

1)基本数据类型的内存占用

在这里插入图片描述
在这里插入图片描述

2)整数的存储方式

梦泽瑶池:原码、反码、补码的讲解


3)大小端字节序

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

  • 大端序 内存地址从低到高排列为:11 22 33 44 即高位字节在低地址。
  • 小端序 内存地址从低到高排列为:44 33 22 11 即低位字节在低地址。
总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提:数据类型的初始化
  • 一、数据类型介绍
    • char数据类型
    • 整数类型
    • 浮点类型
      • 浮点类型运算特性(重要!!!)
    • 布尔类型
    • 总结所有类型的取值范围
  • 二、数据类型的长度和大小
    • 1. 大小(Size)
      • 代码示例
    • 2. 长度(Length)
      • 代码示例
    • 3、关键区别
      • 代码示例
    • 拓展:sizeof关键字
      • sizeof计算基本数据类型大小
      • sizeof计算数组大小
      • sizeof字符串字面量(重要)
  • 三、数据在内存中存储
    • 1)基本数据类型的内存占用
    • 2)整数的存储方式
    • 3)大小端字节序
      • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档