同一个学习群里有人贴了一道题,编号1018,题目就一句话:"其他数据类型存储空间大小"。底下回复说什么的都有:有人说short占2字节,有人说long占8字节,还有人斩钉截铁说bool占4字节。最热闹的是有人把编译器跑出来的结果贴出来,跟教科书对不上。明明是一道入门级别的题目,为什么答案五花八门?
这道题看似在考sizeof,实际上考的是对"数据类型存储空间"这件事背后机制的理解。数据类型的存储空间大小不是一个写死的数字,它跟语言标准、操作系统、编译器的数据模型都有关系。搞清楚这件事,不只是能答对一道练习题,还能帮你避免很多实际开发里的坑——包括序列化结构体、跨平台通信、文件格式设计,甚至面试时候被问到的"int到底是几个字节"。
这篇博文我会从1018这道题出发,把C/C++里"其他数据类型"到底包含哪些类型、每种类型在主流平台上各占多少空间、为什么不同环境答案不一样、怎么用代码逐一验证,以及Java、Python、MySQL这些常见境遇下数据类型的存储大小对照全部拆开讲。适合刚学C语言还对着sizeof发懵的同学,也适合写过几年代码但没仔细抠过这些底层的开发者。
1. "其他数据类型"到底是哪些,很多人从一开始就没理解题意
1.1 分析题目里"其他"这个词的语境
在C语言的教科书体系里,绝大多数教材会把基本数据类型拆成几类来讲,最基础的四类是char(字符型)、int(整型)、float(单精度浮点型)、double(双精度浮点型)。所谓"其他数据类型",是相对这四种"基础中的基础"而言的,通常指的是:
- short(短整型,也可以写成short int)
- long(长整型,long int)
- long long(长长整型,C99标准才正式纳入)
- unsigned/signed修饰后的各种无符号/有符号变体
- bool(C99的_Bool、C++的bool)
- 指针类型(int*、char*、double*等等)
- 复合类型(结构体、联合体、枚举)以及数组
这道题作为练习题出现时,一般考察的是前面几个基本类型和它们的修饰变体。但很多初学者拿到题目之后,脑子里只有一张"背下来的表",比如short=2、long=4、float=4、double=8。背表本身没错,问题在于这张表在不同环境下不通用。
1.2 为什么背表解决不了问题
C语言标准对基本类型存储空间的要求,并不是"必须是多少字节",而是给了一个最小范围约束。它规定short至少要能表示-32767到32767,int至少要能表示-32767到32767,long至少要能表示-2147483647到2147483647。这意味着short最短不能短于16位,但可以比16位更长;long最短不能短于32位,也可以更长。至于实际占多少字节,由编译器和平台决定。
所以你会发现一个非常有意思的现象:同一个类型的sizeof值,在Windows上用MSVC编译和在Linux上用GCC编译可能不一样。最典型的就是long:在64位Linux上是8字节,在Windows 64位上是4字节。这不是bug,是两套数据模型的设计取舍。很多人踩过的坑就是,把Linux上写好的代码用long去存一个64位整数,迁到Windows上发现溢出,一查才发现long从8字节缩水成了4字节。
生活里有个差不多的类比:C标准相当于政府给你规定"每户至少要满足三口人居住",但没规定是60平还是120平。开发商(编译器)在北京盖了120平,在上海盖了80平,房子都合规,但你要搬家具(写入数据)就得先搞清楚自己这套房到底多大。1018这道题真正想考察的,就是你了不了解这个"房子大小由谁决定"的逻辑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 各类型在主流平台上的实际大小,先给一份可对照的速查表
为了不让讨论停在抽象层面,我直接列出当前最主流的几类平台上各个类型的sizeof值。这张表基于常见的32位/64位系统,覆盖GCC(Linux/macOS)和MSVC(Windows)两套编译器。
| 数据类型 | 32位平台 | 64位Linux/macOS | 64位Windows | 说明 |
| --- | --
