整数是计算中最基本的数据结构——如果我们甚至可以称它们为“结构”的话。作为程序员,我们的工作就是赋予这些数字以意义。无论软件多么复杂:最终它只是一个整数,而你的处理器只能理解整数。
如果我们需要负数,我们发明了二进制补码。如果我们需要小数,我们会创建一种科学记数法,然后——砰——我们就有了一个浮点数。归根结底,还是无法逃避零和一。
在C中,int几乎是自然类型。尽管编译器可能会抱怨,但到处都有一些标志,大多数都会允许你写这样的东西:
main(void) { return 0; }
从技术上讲,这与:
int main(void) { return 0; }
这种行为来自于当时的常识:如果程序员没有指定类型,则默认为整数是合理的。
C 的设计就是考虑到了这个想法。最初,int 没有标准大小。 PDP-11 处理器(最初创建 C 的机器)使用 16 位寻址。因此,我们假设 int 也是 16 位才有意义。这个想法是,int 的大小会随着处理器的发展而增长。
这种方法产生了一些问题。如果 int 的大小因平台而异,则为不同处理器编译的程序的行为可能会有所不同。这打破了 C 是一种“不可知论”语言可以编译成不同架构的想法。
与 int 不同,例如,char 始终具有明确定义的大小:8 位,有符号。尽管有它的名字,char 并不是文本字符的抽象类型。它只是一个 8 位数字。例如,文字“a”在编译时转换为数字 97,简单明了。
其他类型呢,比如短的和长的?这个想法很简单:
short <= int <= long
编译器实现者可以完全自由地决定具体大小。
根据ANSI C标准,建立了一些规则:
这个组织有所帮助,但至少可以说 int 的大小仍然令人困惑。 C99 标准引入了 stdint.h 标头,情况有所改善。
现在我们有固定大小的类型:
从那时起,编译器就需要用固定大小的类型来实现这个头。
如今,使用 GCC 和 Clang 等现代编译器,大小更加可预测:
Type | Size |
---|---|
char | 8 bits |
short | 16 bits |
int | 32 bits |
long | 64 bits (32 bits on 32-bit systems) |
long long | 64 bits |
虽然long long还是有些奇特,但至少带来了一些一致性(说实话,我什至觉得long long很时尚)。
今天,我们已经配备了像 stddef.h 和 stdint.h 这样的标头。仅在必要时使用 int,例如 main 函数的返回类型。对于原型之外的任何内容,最好使用 stdint.h 中的固定大小整数,对于数组索引或循环,请使用 stddef.h 中的 size_t。我希望这能让您免去一些麻烦。
感谢您坚持到这里 — 下次见!
以上是C 中的整数:一点历史的详细内容。更多信息请关注PHP中文网其他相关文章!