C语言基础数据类型的最小尺寸是以位还是字节为单位定义的?
C语言基础数据类型的尺寸规则
不同资料里关于int最小尺寸的表述差异,本质是计量参照的基准不一样,不存在谁对谁错,只是都没把适用前提说透。
C标准的底层计量逻辑
- C语言算存储大小的基本单位就是
char,sizeof(char)恒等于1。C标准里提到的“字节”,就是指一个char占的空间,这个空间到底有多少个二进制位,是由limits.h里的CHAR_BIT定义的,从来没强制要求必须是8位。 - 标准不会直接拍板“某个类型必须占几个字节”,而是先规定每个整型类型必须能支持的最小取值范围,再反推它最少需要多少二进制位才能存下这些范围。
举个例子,标准要求有符号的int至少得能存下-32767到32767之间的数,算下来它的最低绝对二进制位宽是16位,这个要求不管在哪个平台上都不能打折扣。
两种“最小尺寸”说法的实际由来
- 说“
int最小是16位”的,指的是跨所有平台通用的绝对位宽底线,这个要求和当前平台的CHAR_BIT是多少没关系。 - 说“
int最小是2字节”的,是默认了现在绝大多数日常开发的平台都是CHAR_BIT=8的情况——毕竟这类平台上,C定义的一个“字节”刚好等于8位,那要存下16位的位宽要求,算下来自然最少得占2个字节。
容易踩的认知坑
- 别把C语言里说的“字节”,和固定8位的“八位组”画等号:只有在
CHAR_BIT=8的平台上,俩概念才是一回事。如果碰到CHAR_BIT=16的老式DSP、专用工控/航天处理器这类特殊平台,一个C定义的“字节”实际就是16位长,这时候满足16位最低要求的int,只需要占1个C意义上的字节,根本不需要凑够2字节。 - 平时写普通应用碰到的PC、手机、通用单片机平台,
CHAR_BIT几乎全是8,所以日常交流里把C的字节等同于8位单元完全没问题,这种场景下两种说法的数值是对得上的,根本不矛盾。
内容的提问来源于stack exchange,提问作者Andy Sukowski-Bang
相关产品推荐
相关产品推荐

