低和高DWORD =>为size_t

时间:2012-08-03 19:06:13

标签: c join size-t dword

编程语言:C

我有两个DWORD:低和高。我想将它们转换为size_t类型的一个变量。我有以下代码:

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

是这样的吗?我猜不是因为第一个命令可能将高字节存储在错误的位置,对吗?请帮我说明如何做到这一点。谢谢:)

2 个答案:

答案 0 :(得分:2)

因此,在32位Microsoft系统上,DWORDsize_t的大小相同。这意味着您无法将两个DWORD放入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位目标上的操作非常相似,所以看起来你仍然在做一些奇怪的事情原因。

答案 1 :(得分: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位。