GCC編譯器基本數據類型長度對照表


https://blog.csdn.net/ababab12345/article/details/103408685
linux DWORD的正確定義
       在進行C語言程序移植時,有時候要把Windows下的程序移植到Linux下,在Windows平台上通常是用VC++開發,在Linux上通常使用GCC編譯代碼。在Windows平台上,大家一般用VC來編譯代碼,VC天然的整合了Windows SDK,在VC里有一個數據類型DWORD,它其實不是一個C語言內建的類型,它是由typedef 創建的類型,最早的定義是在Windows SDK定義的,微軟將它定義在windef.h文件里,定義如下:

typedef unsigned long       DWORD;

DWORD 的本意是定義一個雙字類型(double word),在計算機里一個字節(BYTE)是8位,一個字是16位,雙字是32位。微軟的VC的long 在16位CPU,32位CPU與64位CPU里的長度一直為32位,因此在VC里DWORD一直可以用 無符號 long(即 unsigned long)類型來表示雙字。在Linux系統里,大家用的編譯器是GCC,long類型的長度是不定的,在32位操作系統里,sizeof(long)=4,在64位操作系統里,sizeof(long)=8,因此,在GCC里再用unsigned long來定義DWORD,則在x64系統里,應該是不正確的。
GCC編譯器基本數據類型長度對照表

數據類型 	GCC 32位	GCC 64位
sizeof(char)	1	1
 sizeof(double)	8	8
sizeof(float)	4	4
sizeof(int)	4	4
sizeof(short)	2	2
sizeof(long)	4	8
sizeof(long long)	8	8
sizeof(long double)	12	16
sizeof(complex long double)	16	32

而Linux里的GCC編譯器整數類型 int 的長度無論是在32位CPU還是64位CPU上,長度都是4,因此,為了移植代碼盡量符合Microsoft的初衷,在Linux相關C/C++代碼里應該如下定義DWORD類型:

typedef unsigned int DWORD;

雖然在GCC里將DWORD定義為long,在大多數情況下,程序能夠正常運行,但也許在一些需要數據交互的情況下,程序就不一定能夠正常了,例如將DWORD記錄在文件里,如果在64位操作系統里 將被存儲64位數據,在32位操作系統里,將被存儲32位數據,因此可能會出現錯誤。

在以前的32位程序設計當中,好多代碼一直把DWORD 與指針類型互用,例如CreateIoCompletionPort等函數,在64位移植時可能會發送錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM