編程語言:C低和高DWORD => size_t
我有兩個DWORD:低和高。我想將它們轉換爲size_t類型的一個變量。我有以下代碼:
size_t fileSize = fileSizeHigh;
size_t *pfileSize = &fileSize;
pfileSize[4] = fileSizeLow;
這是對的嗎?我想不是因爲第一個命令可能會將高字節存儲在錯誤的位置,對吧?請幫助我如何做到這一點。謝謝:)
編程語言:C低和高DWORD => size_t
我有兩個DWORD:低和高。我想將它們轉換爲size_t類型的一個變量。我有以下代碼:
size_t fileSize = fileSizeHigh;
size_t *pfileSize = &fileSize;
pfileSize[4] = fileSizeLow;
這是對的嗎?我想不是因爲第一個命令可能會將高字節存儲在錯誤的位置,對吧?請幫助我如何做到這一點。謝謝:)
因此,在32位Microsoft系統上,DWORD
與size_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位目標非常相似,所以它仍然看起來像是在做一些奇怪的事情。
如果您正在編寫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位代碼。
謝謝。是的,我使用的是64位系統(Win7 x64)。 size_t是否有替代64bit大小的操作系統? – 2012-08-04 10:26:46
'unsigned __int64'是替代類型。 *但是,如果您告訴我們您要做什麼*,我們可以幫助您找出更好的方法。 – 2012-08-04 17:17:06
謝謝。我想讀出文件的大小。爲了達到這個目的,我首先使用CreateFile打開文件。然後我用GetFileSize讀出大小。因此,我得到一個低和一個高DWORD。最後我想加入他們。 (是的,我知道我的代碼因爲使用WinAPI而不可移植) – 2012-08-04 18:48:33