各种类型所占大小

下面代码显示各类型所占大小

32位win7,编译器:Dev-Cpp_5.6.1_MinGW_4.8.1_Setup

#include<stdio.h>
int main()
{
	printf("%d\n",sizeof(char));
	printf("%d\n",sizeof(short));
	printf("%d\n",sizeof(int));
	printf("%d\n",sizeof(long));
	printf("%d\n",sizeof(long long));
	printf("%d\n",sizeof(__int64));
	printf("%d\n",sizeof(float));
	printf("%d\n",sizeof(double));
	
	return 0;
}

下面是结果



在 C 语言中,**布尔类型(`_Bool` 或 `bool`)所的空间大小是 1 字节(即 8 位)**,尽管它只需要 1 位来表示真或假。 --- ### ✅ 标准定义与验证 #### 1. **C99 标准中的布尔类型** C99 引入了 `_Bool` 类型,并通过 `<stdbool.h>` 提供了别名 `bool`: ```c #include <stdio.h> #include <stdbool.h> int main() { printf("Size of bool: %zu bytes\n", sizeof(bool)); printf("Size of _Bool: %zu bytes\n", sizeof(_Bool)); return 0; } ``` **输出结果:** ``` Size of bool: 1 bytes Size of _Bool: 1 bytes ``` > ⚠️ 尽管逻辑上只需 1 bit,但 C 标准规定 `_Bool` 是一个完整的存储单元,最小可寻址单位是字节,因此用 **1 字节(8 bits)**。 --- ### 🔍 为什么不是 1 bit? - 计算机内存以 **字节为单位寻址**,无法直接对单个 bit 进行地址引用。 - 如果把多个布尔值压缩到一个字节内,访问时需要额外的位操作(掩码、移位),效率低且复杂。 - 因此,编译器选择用 **1 字节存储一个 `_Bool` 变量**,便于快速读写和对齐。 --- ### 🧪 实际内存布局示例 ```c #include <stdio.h> #include <stdbool.h> struct test_bool { bool flag1; bool flag2; int value; bool flag3; }; int main() { struct test_bool t = { true, false, 100, true }; printf("Size of struct: %zu bytes\n", sizeof(struct test_bool)); printf("Address of flag1: %p\n", &t.flag1); printf("Address of flag2: %p\n", &t.flag2); printf("Address of value: %p\n", &t.value); printf("Address of flag3: %p\n", &t.flag3); return 0; } ``` 输出可能类似: ``` Size of struct: 12 bytes Address of flag1: 0x7fff5fbff6ac Address of flag2: 0x7fff5fbff6ad Address of value: 0x7fff5fbff6b0 Address of flag3: 0x7fff5fbff6b4 ``` 说明: - 每个 `bool` 1 字节 - 存在填充(padding)以满足 `int` 的 4 字节对齐要求 --- ### 💡 如何节省空间?使用位域(Bit-field) 如果你希望多个布尔值共享同一个字节,可以使用 **结构体位域**: ```c struct flags { unsigned int flag1 : 1; // 1 bit unsigned int flag2 : 1; unsigned int flag3 : 1; unsigned int reserved : 5; // 填充剩余位 }; int main() { printf("Size of struct flags: %zu bytes\n", sizeof(struct flags)); // 输出 4 或 1(取决于编译器) return 0; } ``` - 在大多数编译器上,这样的结构体至少 **1 字节** - 可大幅节省内存,适合嵌入式系统或大量标志位场景 --- ### 📌 不同语言对比 | 语言 | 布尔类型 | 所空间 | 说明 | |------|----------|-----------|-------| | C(C99+) | `_Bool` / `bool` | 1 字节 | 来自 `<stdbool.h>` | | C++ | `bool` | 1 字节 | 独立类型,非宏 | | Java | `boolean` | 未明确定义 | JVM 实现通常为 1 字节或更多 | | Python | `bool`(继承自 `int`) | 28 字节(小整数缓存) | 对象开销大 | | C# | `bool` | 1 字节 | `sizeof(bool)` 返回 1 | --- ### ✅ 总结 | 项目 | 内容 | |------|------| | 类型名称 | `_Bool`(C99)、`bool`(需包含 `<stdbool.h>`) | | 实际大小 | **1 字节(8 bits)** | | 最小存储单位 | 字节(不可单独寻址 bit) | | 是否可优化 | 可使用位域压缩多个布尔值 | | 典型用途 | 条件判断、状态标志 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值