C语言各数据类型所占内存空间大小

本文详细介绍了在64位编译器环境下,各种常见数据类型的字节大小,包括char、char*、shortint、int、unsignedint、float、double、long、longlong和unsignedlong等。这对于理解内存分配和优化代码性能至关重要。
以目前常见的64位机的64位编译器为例,括号内为其他
  • char :1个字节
  • char *(即指针变量):8个字节(16位是2B,32位是4B,64位是8B)
  • short int :2个字节
  • int :4个字节(16位机是2B,32位&64位是4B)
  • unsigned int :4个字节(16位机是2B,32位&64位是4B)
  • float :4个字节
  • double :8个字节
  • long :8个字节 (16位&32位&win64是4B,Linux64位是8B)
  • long long :8个字节
  • unsigned long :8个字节(16位&32位是4B,64位是8B)
    在这里插入图片描述
<think> 我们正在讨论C语言中不同数据类型占用的内存大小。注意,C语言标准只规定了最小范围,具体大小取决于编译器和硬件平台(如51单片机、x86等)。 我将按照常见情况(如PC上的32/64位系统)和嵌入式系统(如51单片机)分别说明。 由于用户可能关注嵌入式开发,我会特别提及51单片机的情况。 常见数据类型占用内存(以字节为单位): 1. 基本类型: - char: 1字节(在所有平台通常如此) - int: 在16位系统(如51单片机)中为2字节,在32/64位系统中通常为4字节 - short: 通常2字节 - long: 在32/64位系统中通常为4字节或8字节(64位系统) - long long: 通常8字节 - float: 通常4字节 - double: 通常8字节(但在51单片机中可能不支持或由编译器决定) 2. 修饰符: - signed/unsigned:不改变大小,只改变表示范围 - 指针:在32位系统中为4字节,64位系统中为8字节,但在51单片机(16位地址)中可能是2字节(具体由内存模型决定) 3. 51单片机(如8051)的典型情况(使用Keil C51编译器): - char: 1字节 - int: 2字节 - long: 4字节 - float: 4字节 - 指针:分为通用指针(3字节,包含存储类型信息)和指定存储区的指针(1字节或2字节) 注意:具体大小可以使用sizeof运算符在程序中获取。 示例代码(获取大小): ```c #include <stdio.h> int main() { printf("char: %d\n", sizeof(char)); printf("int: %d\n", sizeof(int)); printf("short: %d\n", sizeof(short)); printf("long: %d\n", sizeof(long)); printf("float: %d\n", sizeof(float)); printf("double: %d\n", sizeof(double)); printf("int*: %d\n", sizeof(int*)); return 0; } ``` 运行此程序可在目标平台上得到确切大小。 总结表格(常见环境): | 数据类型 | 51单片机(Keil) | 32位系统 | 64位系统 | |----------------|------------------|----------|----------| | char | 1 | 1 | 1 | | int | 2 | 4 | 4 | | short | 2 | 2 | 2 | | long | 4 | 4 | 8 | | long long | 8 | 8 | 8 | | float | 4 | 4 | 4 | | double | 8(可能不支持) | 8 | 8 | | 指针(通用) | 3(特殊) | 4 | 8 | | 指针(指定区) | 1或2 | - | - | 注意:51单片机的指针有特殊处理,因为其内存分为不同的存储区(data, idata, xdata, code等),不同存储区的指针大小可能不同。 §§相关问题§§ 1. 在C语言中,如何通过程序获取某个数据类型在当前平台大小? 2. 为什么51单片机的指针类型会有不同的字节大小? 3. 在64位系统中,long类型为什么可能是8字节而int类型却是4字节? 4. 使用unsigned修饰数据类型会改变其内存占用吗? 5. 在嵌入式开发中,为什么选择合适的数据类型对内存优化至关重要? </think> ### 回答 在C语言中,数据类型的内存占用大小**取决于编译器和硬件平台**(如操作系统位数、CPU架构)。以下是常见环境下的典型内存占用(单位:字节): #### 基础数据类型(以x86_64架构为例) | 数据类型 | 内存占用 | 说明 | |----------------------|----------|-------------------------------| | **`char`** | 1 | 字符或小整数(-128~127) | | **`unsigned char`** | 1 | 小范围正整数(0~255) | | **`short`** | 2 | 短整数(-32,768~32,767) | | **`int`** | 4 | 默认整数类型(约±21亿) | | **`long`** | 4或8 | 32位系统占4字节,64位系统占8字节 | | **`long long`** | 8 | 大整数(约±9×10¹⁸) | | **`float`** | 4 | 单精度浮点数(精度约6~7位小数)| | **`double`** | 8 | 双精度浮点数(精度约15位小数) | | **`void*`**(指针) | 8 | 64位系统地址空间 | #### 特殊场景说明 1. **51单片机(Keil编译器)** - `int` 占 **2字节**(16位) - 指针占 **3字节**(因分代码/数据存储区) - 无`double`支持(通常用`float`替代) 2. **大小验证方法** 使用`sizeof`运算符直接获取: ```c printf("int 大小: %zu\n", sizeof(int)); // 输出当前环境下int的字节数 ``` 3. **内存对齐影响** 结构体(`struct`)因内存对齐规则可能导致实际占用大于成员之和,例如: ```c struct Example { char a; // 1字节 int b; // 4字节 → 实际结构体占8字节(对齐填充3字节) }; ``` #### 重要规则 - C标准仅规定**最小范围**(如`int`至少覆盖-32767~32767),具体大小由实现决定。 - 嵌入式系统中(如STM32、Arduino),`int`通常为2或4字节,需查阅编译器手册。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值