C语言固定宽度整数类型是否需全定义或全不定义?是否存在缺失?
C语言固定宽度整数类型的可选性与缺口问题
C标准在<stdint.h>头文件中定义了int8_t、int16_t、int32_t、int64_t及其对应的无符号变体(如uint8_t),同时明确说明:
这些类型是可选的。
针对你提出的问题,逐一解答:
固定宽度类型是否会存在“缺口”?
是的,完全可能存在。固定宽度类型的定义前提是,平台存在恰好对应宽度且没有填充位的原生整数类型。
比如,假设某个平台的char是恰好8位(无填充),所以int8_t/uint8_t可以被定义;但该平台的short和int都是32位(满足标准“至少16位”的要求),没有原生的16位整数类型,那int16_t/uint16_t就不会被定义;同时如果long是恰好32位,那int32_t/uint32_t会被定义。这种情况下,固定宽度类型就出现了“8位存在、16位缺失、32位存在”的缺口。
“这些类型”是单独可选还是整体可选?是否可以只定义部分?
标准中“这些类型是可选的”指的是每个类型单独可选,符合标准的实现完全可以只定义部分固定宽度类型。
你完全需要担心uint8_t已定义但uint16_t未定义的情况——只要平台没有恰好16位且无填充的整数类型,实现就有权不提供uint16_t;而如果平台有恰好8位的整数类型,就可以同时提供uint8_t,这完全符合C标准的要求。
补充:可移植代码的替代方案
如果需要编写跨平台的可移植代码,不想依赖可选的固定宽度类型,可以使用标准要求必须提供的两类类型:
int_leastN_t/uint_leastN_t:至少N位的最小宽度整数类型,保证能容纳N位数据int_fastN_t/uint_fastN_t:至少N位的最快运算整数类型,兼顾宽度和性能
内容的提问来源于stack exchange,提问作者CPlus
相关产品推荐
相关产品推荐

