up next   top/contents search

comp.lang.c FAQ 列表· 问题 1.1

我应该如何决定使用哪种整数类型?


如果可能需要较大的值(大于 32,767 或小于 -32,767),请使用long否则,如果空间非常重要(例如,存在大型数组或许多结构),请使用short否则,请使用int如果定义良好的溢出特性很重要,并且不需要负值,或者如果您想在操作位或字节时避免符号扩展问题,请使用相应的unsigned类型。(但要注意在表达式中混合有符号值和无符号值;请参见问题 3.19。)

虽然字符类型(尤其是unsigned char)可以用作“微型”整数,但这样做有时会带来比其价值更多的麻烦。编译器将需要发出额外的代码来转换charint(使可执行文件更大),并且意外的符号扩展可能会带来麻烦。(使用unsigned charcan help; see question 12.1 for a related problem.)

在决定使用floatdoublefloat值转换为在表达式求值期间。) 如果指向变量的指针必须具有特定类型,则以上规则均不适用。

引用某些类型的数据(例如内存中对象的大小)的变量可以并且应该使用预定义的抽象类型,例如size_t.

人们常常错误地认为 C 的类型被定义为具有某些精确的大小。 实际上,保证的是

从这些值可以推断出char类型至少是 8 位,short intint类型至少是 16 位,并且long int类型至少是 32 位。(每种类型的有符号和无符号版本保证具有相同的大小。)在 ANSI C 下,可以在头文件<limits.h>中找到特定机器的最大值和最小值;以下是一个总结

基本类型最小大小(位)最小值(有符号)最大值(有符号)最大值(无符号)
char8-127127255
short16-32,76732,76765,535
int16-32,76732,76765,535
long32-2,147,483,6472,147,483,6474,294,967,295
(这些值是标准保证的最小值。许多实现允许更大的值,但可移植程序不应依赖它。)

如果由于某种原因需要声明具有精确大小的东西(通常这样做的唯一好理由是试图符合某些外部强制的存储布局,但请参见问题 20.5),请务必将选择封装在适当的 typedef 之后,但请参见问题 1.3

如果您需要操作巨大的值,大于 C 内置类型的保证范围,则需要任意精度(或“多精度”)算术库;请参见问题 18.15d

参考文献:K&R1 第 2.2 节,第 34 页
K&R2 第 2.2 节,第 36 页,第 A4.2 节,第 195-6 页,第 B11 节,第 257 页
ISO 第 5.2.4.2.1 节,第 6.1.2.5 节
H&S 第 5.1,5.2 节,第 110-114 页


up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管