10

在 80 年代从 16 位过渡到 32 位期间,int是 16 位或 32 位。使用当前的 64 位转换命名法,我知道 ILP32 和 LP32 机器的分布相当均匀。当时我相信人们理解,int对于任何给定的架构,它始终遵循寄存器或指针宽度,并且long将保持 32 位。

快进 25 年,我看到 LP64 相当主流,但直到我遇到 64 位平台 [我在 2007 年发现桌面 Linux :)],我一直期望 IP64 是下一个合乎逻辑的步骤。

  1. 这(LP64)是 64 位的预期演变吗?
    • 这种关系如何char <= short <= int <= long适应这种将整数类型固定到我们留下的每个平台的新兴方案?
    • 这些过渡方案与在各种平台上使用(您选择的{l,u}caseWORD/有何关系?DWORD
    • Windows 的某些区域仍然包含INT16 位的表单。Windows 会脱离 LLP64 还是为时已晚?
    • 为什么这次int选择被抛在后面,而不是在 32 位过渡期间?
4

2 回答 2

9

我的看法是,Windows 在整个 x64 转换中是个怪人。但撇开这一点不谈,C 或 C++ 从未将整数类型定义为固定长度。如果你这样看,我觉得整个 // 事情是可以理解的intlongpointer

  • int:主要是 32 位长(Linux、Mac 和 Windows)
  • long:Mac 和 Linux 上为 64 位,Windows 上为 32
  • long long:Mac、Linux 和 Windows x64 上的 64 位
  • ( u) intptr_t:指针的准确长度(32 位上为 32,64 位系统上为 64)

WORD而且DWORD很丑,应该避免。如果 API 强制您使用它们,请在处理时替换DWORDDWORD_PTR......好吧,指针。恕我直言,首先在此处使用 ( D)是不正确的。WORD

我认为 Windows 永远不会改变它的决定。已经太麻烦了。

为什么被int抛在后面?为什么金星的自转方向相反?第一个问题的答案在这里(我相信),第二个有点复杂;)

于 2010-07-24T15:57:51.293 回答
4

与其将其视为int“落后”,我会说您应该从无法留下任何可能需要的尺寸类型的角度来看待它。我想编译器可以int32_t根据一些内部扩展类型来定义,但是由于 C99 仍然没有得到广泛支持,当应用程序的构建系统找不到 32 位时__int32_t,必须解决丢失的定义将是一个主要的痛苦int32_t标准类型中的类型。并且拥有 32 位类型必不可少的,无论您的本机字长是多少(例如,它是 Unicode 代码点值的唯一正确类型)。

short出于同样的原因,制作32 位和64 位是不可行int的:16 位类型对于很多事情都是必不可少的,首先想到的是音频处理。(更不用说 Windows/Java 丑陋的 UTF-16 痴迷了..)

真的,我认为 16 到 32 位和 32 到 64 位的转换完全没有可比性。离开 16 位就是留下一个系统,在这个系统中,日常生活中遇到的大多数数字都不适合基本类型,并且必须使用像“远”指针这样的技巧来处理非平凡的数据集。另一方面,大多数应用程序对 64 位类型的需求最少。大型货币数字、多媒体文件大小/偏移、磁盘位置、高端数据库、对大文件的内存映射访问等是一些浮现在脑海中的专门应用程序,但没有理由认为文字处理器永远需要数十亿个字符,或者一个网页将需要数十亿个 html 元素。

于 2010-07-24T16:38:24.513 回答