如果 int 是 64 位,则有一个代码习惯用法会中断,而且我经常看到它,以至于我认为它可以称为合理的:
- 通过测试 if 来检查值是否为负
((val & 0x80000000) != 0)
这通常在检查错误代码时发现。许多错误代码标准(如 Window's HRESULT
)使用第 31 位来表示错误。代码有时会通过测试第 31 位或有时通过检查错误是否为负数来检查该错误。
Microsoft 用于测试 HRESULT 的宏同时使用了这两种方法——而且我敢肯定,在不使用 SDK 宏的情况下,有大量代码可以实现类似的功能。如果 MS 已转移到 ILP64,这将是导致移植头痛的一个领域,而 LLP64 模型(或 LP64 模型)可以完全避免这些问题。
注意:如果您不熟悉“ILP64”之类的术语,请参阅答案末尾的迷你词汇表。
我很确定有很多代码(不一定是面向 Windows 的)使用plain-old-int 来保存错误代码,假设这些 int 的大小是 32 位。而且我敢打赌,有很多带有错误状态方案的代码也使用两种检查(< 0
并且设置了第 31 位),如果移动到 ILP64 平台,它们会中断。如果仔细构造错误代码以便进行符号扩展,则这些检查可以继续正常工作,但同样,我见过的许多这样的系统通过将一堆位域组合在一起来构造错误值.
无论如何,我认为这无论如何都不是一个无法解决的问题,但我确实认为这是一种相当普遍的编码实践,如果迁移到 ILP64 平台会导致大量代码需要修复。
请注意,我也不认为这是 Microsoft 选择 LLP64 模型的最重要原因之一(我认为该决定很大程度上是由 32 位和 64 位进程之间的二进制数据兼容性驱动的,如MSDN和on Raymond Chen 的博客)。
64 位平台编程模型术语的迷你词汇表:
- ILP64:
int
, long
, 指针是 64 位的
- LP64:
long
指针是 64 位的,int
是 32 位的(被许多(大多数?)Unix 平台使用)
- LLP64:
long long
指针是 64 位的,int
并且long
保持 32 位(在 Win64 上使用)
有关 64 位编程模型的更多信息,请参阅“64 位编程模型:为什么选择 LP64?”