Why is the size of a native long primitive on 64-bit Windows only 4 bytes?

时间:2015-10-31 00:04:55

标签: c windows x86 x86-64 win64

Will someone please tell me how this makes any sense, and how to make it stop? Seriously, am I crazy or is the 64-bit Windows long type only 4 bytes? How does that make any sense? I thought the native long primitive size was supposed to be the same as the native register size. [32-bit Linux] me@u32:~$ ./sizes32 sizeof(char): 1 sizeof(short): 2 sizeof(int): 4 sizeof(long): 4 sizeof(long long): 8 [64-bit Linux] me@u64:~$ ./sizes64 sizeof(char): 1 sizeof(short): 2 sizeof(int): 4 sizeof(long): 8 sizeof(long long): 8 [32-bit Windows] C:\Users\me\Downloads>sizes32.exe sizeof(char): 1 sizeof(short): 2 sizeof(int): 4 sizeof(long): 4 sizeof(long long): 8 [64-bit Windows] C:\Users\me\Downloads>sizes64.exe sizeof(char): 1 sizeof(short): 2 sizeof(int): 4 sizeof(long): 4 sizeof(long long): 8

3 个答案:

答案 0 :(得分:5)

向后兼容性!

Windows来自16位平台sizeof(long) == 4,它广泛使用LONGDWORD等类型...并且更改它会导致大量代码崩溃或无法编译

  

在第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位程序无法使用此结构来解析位图文件。

Why did the Win64 team choose the LLP64 model?

答案 1 :(得分:4)

long has to be at least 32-bits, at least as big as int and no bigger than long long. That's it. Period.

答案 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}}