电话
400 9058 355
C++中char、short、int、long、long long等类型大小不固定,仅规定最小位宽和相对大小关系,实际字节数依赖编译器和平台;char恒为1字节,其余类型需用定宽类型或sizeof/numeric_limits验证。
C++ 标准只规定了这些类型的**最小位宽**和相对大小关系(比如 sizeof(long) >= sizeo),不强制要求具体字节数。实际大小取决于编译器和目标平台。例如在 Windows x64 上用 MSVC,
int 是 4 字节;但在某些嵌入式平台,int 可能是 2 字节。
常见误区是认为 int 一定是 4 字节——它只是「通常」是,但不可依赖。需要可移植代码时,优先用 中的定宽类型,比如 int32_t、uint8_t。
char 固定为 1 字节(sizeof(char) == 1 是 C++ 强制保证)short ≥ 16 位,常见为 2 字节int ≥ 16 位,主流平台多为 4 字节long ≥ 32 位,Windows x64 是 4 字节,Linux x64 是 8 字节long long ≥ 64 位,几乎所有现代平台都是 8 字节IEEE 754 是事实标准,但 long double 尤其危险:MSVC 完全忽略它(和 double 等价),GCC 在 x86 上用 80 位扩展精度(10 字节存储,但 sizeof(long double) 常为 12 或 16),而 ARM64 通常直接映射为 64 位 double。
如果你写数值计算,别假设 long double 更精确——先查编译器文档,或直接用 std::numeric_limits 检查有效十进制位数。
float:通常 4 字节,约 6–7 位十进制精度double:通常 8 字节,约 15–16 位long double:3 字节起跳,行为高度平台相关,sizeof 不等于实际精度位宽bool 的 sizeof 不是 1 字节就安全——它只是“至少能存 true/false”,实际大小由 ABI 决定(常见为 1 字节,但某些调试模式或结构体对齐下可能被填充成 4 字节)。更关键的是:bool 只有两个合法值:true、false;用 memcpy 或位操作往 bool* 写非 0/1 值是未定义行为。
void 不能定义变量,但 void* 是万能指针类型;注意它不能算术运算(ptr + 1 非法),也不能解引用。C++17 起禁止 void 作为函数返回值以外的用途(如模板参数)。
sizeof(bool) 推断内存布局,结构体中它的偏移受对齐规则支配void* 转其他指针必须显式 static_cast,C 风格转换在 C++ 中不推荐void 函数参数列表 () 表示无参数,不是“任意参数”(那是 ...)别靠记忆或教程表格,直接运行 sizeof 和 std::numeric_limits。尤其当跨平台开发或对接 C API(比如 OpenGL、Win32)时,结构体字段大小错一位,整个二进制协议就崩。
最简验证方式:
#include#include int main() { std::cout << "int: " << sizeof(int) << " bytes\n"; std::cout << "double: " << sizeof(double) << " bytes\n"; std::cout << "int max: " << std::numeric_limits ::max() << "\n"; }
记住:同一份源码,在 MSVC、Clang、GCC 下,甚至同一编译器不同架构目标(x86 vs aarch64)下,结果都可能不同。最保险的做法,是在构建脚本里加入 size check 断言,或者用 static_assert(sizeof(int) == 4, "int must be 4 bytes for our protocol")。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...