我遇到的每一种现代编程语言都有明确定义的数据类型。例如,Java 有一个int
正好是 32 位的和一个long
正好是 64 位的。这不是特定于实现的,而是内置在规范本身中的。另一方面,C具有至少16位的a short
、至少16位的anint
和long
至少32位的a。但是,因为它被定义为至少,它们可能会更大,这会导致严重的可移植性问题。
我一直不明白这一点。我一直把它归结为 1970 年代不同硬件标准的结果,但这对我来说实际上没有意义。即使有很多计算机无法处理 64 位数据类型,这仍然不能成为不将 a 定义为short
16位和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
循环中的控制变量。