实际上,在不需要知道类型的确切大小的情况下存储数字是很常见的。我的程序中有很多数量我可以合理地假设不会超过 20 亿,或者强制它们不超过。但这并不意味着我需要一个精确的 32 位类型来存储它们,任何可以计数到至少 20 亿的类型对我来说都可以。
如果您尝试编写非常可移植的代码,则必须记住,固定宽度类型都是可选的。
在 C99 实现中, whereCHAR_BIT
大于8
no int8_t
。该标准禁止它存在,因为它必须具有填充位,并且intN_t
类型被定义为没有填充位(7.18.1.1/1)。uint8_t
因此也被禁止,因为(谢谢,ouah)不允许定义uint8_t
没有int8_t
.
因此,在非常可移植的代码中,如果您需要一个能够保存高达 127 值的有符号类型,那么您应该使用、signed char
或根据您是否要要求编译器制作它:int
int_least8_t
int_fast8_t
- 在 C89 (
signed char
或int
)中工作
- 避免在算术表达式中出现令人惊讶的整数提升 (
int
)
- 小(
int_least8_t
或signed char
)
- 快(
int_fast8_t
或int
)
对于高达 255 的无符号类型也是如此,带有unsigned char
、和.unsigned int
uint_least8_t
uint_fast8_t
如果您需要在非常可移植的代码中进行模 256 运算,那么您可以自己取模、屏蔽位或使用位域玩游戏。
实际上,大多数人从不需要编写可移植的代码。目前CHAR_BIT > 8
只出现在专用硬件上,您的通用代码不会在它上面使用。当然,这在未来可能会改变,但如果确实如此,我怀疑有太多代码对 Posix 和/或 Windows(两者都保证CHAR_BIT == 8
)做出假设,那么处理代码的不可移植性将只是其中的一小部分将代码移植到该新平台的巨大努力。任何这样的实现都可能不得不担心如何连接到互联网(它处理八位字节),早在它担心如何让你的代码启动和运行之前:-)
如果您无论如何都假设,CHAR_BIT == 8
那么我认为(u)int8_t
除了您希望代码在 C89 中工作之外,没有任何特别的理由可以避免。stdint.h
即使在 C89 中,为特定实现找到或编写一个版本也不是那么难。但是,如果您可以轻松地将代码编写为只要求类型可以保持255
,而不是要求它不能保持256
,那么您不妨避免对CHAR_BIT == 8
.