我遇到的每一种现代编程语言都有明确定义的数据类型。例如,Java 有一个int正好是 32 位的和一个long正好是 64 位的。这不是特定于实现的,而是内置在规范本身中的。另一方面,C具有至少16位的a short、至少16位的anint和long至少32位的a。但是,因为它被定义为至少,它们可能会更大,这会导致严重的可移植性问题。
我一直不明白这一点。我一直把它归结为 1970 年代不同硬件标准的结果,但这对我来说实际上没有意义。即使有很多计算机无法处理 64 位数据类型,这仍然不能成为不将 a 定义为short16位和32 位的借口。根据标准,我们已经将 32 位视为任何硬件的最低要求。int
这种标准的扩散导致了以下建议,取自文章How to C(截至 2016 年):
如果您发现自己在新代码中输入
char或int或short或或long或unsigned,那么您做错了。对于现代程序,您应该
#include <stdint.h>使用标准类型。有关详细信息,请参阅
stdint.h规范。常见的标准类型有:
int8_t,int16_t,int32_t,int64_t— 有符号整数uint8_t,uint16_t,uint32_t,uint64_t— 无符号整数float— 标准 32 位浮点double- 标准 64 位浮点注意我们没有
char了。char 实际上在 C 中被错误命名和误用。
char即使在进行无符号byte操作时,开发人员也经常滥用“<code>byte”的意思。uint8_t用来表示单个无符号字节/八位字节值和uint8_t *表示无符号字节/八位字节值序列要干净得多。
我还注意到有很多建议建议将其size_t用作标准去int替换,就像Jens Gustedt 在 Modern C 中一样,它在本书的第一个示例中使用 asize_t作为for循环中的控制变量。