答案 0 :(得分:5)
向后兼容性!
Windows来自16位平台sizeof(long) == 4
,它广泛使用LONG
,DWORD
等类型...并且更改它会导致大量代码崩溃或无法编译
在第9频道,成员Beer28写道,“我无法想象类型宽度发生变化的节目存在太多问题。”我从中得到了一个很好的笑声并记下了在Win64数据模型上写一个条目。
Win64团队选择了LLP64数据模型,其中所有整数类型都保留32位值,只有指针扩展为64位值。为什么呢?
除了在该网页上给出的原因之外,另一个原因是这样做可以避免破坏持久性格式。例如,位图文件的部分标题数据由以下结构定义:
typedef struct tagBITMAPINFOHEADER { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
如果LONG从32位值扩展到64位值,则64位程序无法使用此结构来解析位图文件。
答案 1 :(得分:4)
答案 2 :(得分:2)
你已经有了很多有效的回复。
仅供记录,这里是C ++标准中的精确定义:
3.9.1 / 2:有五种标准的有符号整数类型:“signed char”,“short” int“,”int“,”long int“和”long long int“。在此列表中,每种类型 在列表中提供至少与它之前的存储一样多的存储空间。 (...)平原锭具有建筑所建议的自然尺寸 执行环境(44)。
最后一句话表明int的大小与寄存器相对应。不幸的是,它的脚注只是说:“(44),它足够大,可以包含INT_MIN和INT_MAX范围内的任何值,如标题{中所定义的那样,而不是讲述宇宙起源的全部故事。 {1}} “