2012-08-03 39 views
0

編程語言:C低和高DWORD => size_t

我有兩個DWORD:低和高。我想將它們轉換爲size_t類型的一個變量。我有以下代碼:

size_t fileSize = fileSizeHigh; 
size_t *pfileSize = &fileSize; 
pfileSize[4] = fileSizeLow; 

這是對的嗎?我想不是因爲第一個命令可能會將高字節存儲在錯誤的位置,對吧?請幫助我如何做到這一點。謝謝:)

回答

2

因此,在32位Microsoft系統上,DWORDsize_t的大小相同。這意味着您無法將兩個DWORD s放入size_t佔用的空間中。

您的代碼只會在fileSize的末尾寫入內存,並且具有未定義的行爲。它不會做你想要的。

你究竟想要完成什麼?你想完成什麼任務?請告訴我們,我們可能會爲您提供備用解決方案。

編輯:作爲@nos解釋說,在64位系統上size_t可容納兩個DWORD秒。如果您使用的是64位系統,你可以使用比特移位合併的兩條:

size_t combined = ((size_t)high << 32) | (size_t)low; // 64-BIT WINDOWS ONLY 

然而,這仍然是一個有點代碼味道,因爲在64位Windows目標操作指與32位目標非常相似,所以它仍然看起來像是在做一些奇怪的事情。

0

如果您正在編寫64位代碼,size_t通常是64位。您需要在您的平臺上進行驗證。一個DWORD通常是32位,你也需要驗證。由於32位DWORD位和64位的size_t,你這樣做:

DWORD a = ...; 
DWORD b = ...; 
size_t c = (size_t)a << 32 | b; 

如果你正在編寫32位代碼,那就沒有意義的2種的32位類型組合成另一種32位的,爲size_t通常是32位在32位代碼。

+0

謝謝。是的,我使用的是64位系統(Win7 x64)。 size_t是否有替代64bit大小的操作系統? – 2012-08-04 10:26:46

+0

'unsigned __int64'是替代類型。 *但是,如果您告訴我們您要做什麼*,我們可以幫助您找出更好的方法。 – 2012-08-04 17:17:06

+0

謝謝。我想讀出文件的大小。爲了達到這個目的,我首先使用CreateFile打開文件。然後我用GetFileSize讀出大小。因此,我得到一個低和一個高DWORD。最後我想加入他們。 (是的,我知道我的代碼因爲使用WinAPI而不可移植) – 2012-08-04 18:48:33