1

编程语言:C

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

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

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

4

2 回答 2

2

因此,在 32 位 Microsoft 系统上, aDWORD的大小与size_t. 这意味着您不能将两个DWORDs 放入 a 占用的空间中size_t

您的代码将简单地写入超出末尾的内存fileSize并且具有未定义的行为。它不会做你想做的事。

你真正想要完成的是什么?您要完成的任务是什么?告诉我们,我们或许可以为您提供替代解决方案。

编辑:正如@nos 解释的那样,在 64 位系统上 asize_t可以容纳两个DWORDs。如果您使用的是 64 位系统,则可以使用位移来将两者结合起来:

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

然而,这仍然有点代码味道,因为 64 位 Windows 目标上的操作与 32 位目标上的操作非常相似,所以看起来你在做某事的原因很奇怪。

于 2012-08-03T19:09:51.450 回答
1

如果您正在编写 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 位代码。

于 2012-08-03T19:13:06.677 回答