编程语言:C
我有两个 DWORD:一个低的和一个高的。我想将它们都转换为 size_t 类型的一个变量。我有以下代码:
size_t fileSize = fileSizeHigh;
size_t *pfileSize = &fileSize;
pfileSize[4] = fileSizeLow;
是这样吗?我猜不是因为第一个命令可能将高字节存储在错误的位置,对吧?请帮助我如何做到这一点。谢谢你 :)
因此,在 32 位 Microsoft 系统上, aDWORD
的大小与size_t
. 这意味着您不能将两个DWORD
s 放入 a 占用的空间中size_t
。
您的代码将简单地写入超出末尾的内存fileSize
并且具有未定义的行为。它不会做你想做的事。
你真正想要完成的是什么?您要完成的任务是什么?告诉我们,我们或许可以为您提供替代解决方案。
编辑:正如@nos 解释的那样,在 64 位系统上 asize_t
可以容纳两个DWORD
s。如果您使用的是 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 位代码。