【问题标题】:Low and High DWORD => size_t低和高 DWORD => size_t
【发布时间】:2012-08-03 19:06:12
【问题描述】:

编程语言:C

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

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

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

【问题讨论】:

    标签: c join size-t dword


    【解决方案1】:

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

    您的代码将简单地写入到fileSize 末尾之外的内存中,并且具有未定义的行为。它不会做你想做的。

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

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

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

    但是,这仍然有点代码异味,因为 64 位 Windows 目标上的操作与 32 位目标上的操作非常相似,所以看起来您仍然在做一些奇怪的事情原因。

    【讨论】:

      【解决方案2】:

      如果您正在编写 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)。是否有大小独立于操作系统的 64 位 size_t 的替代方案?
      • unsigned __int64 是替代类型。 但如果您告诉我们您想要做什么,我们或许可以帮助您找出更好的方法。
      • 谢谢。我想读出文件的大小。为此,我首先使用 CreateFile 打开文件。然后我用 GetFileSize 读出大小。结果,我得到了一个低和高的 DWORD。最后我想加入他们。 (是的,我知道我的代码不可移植,因为我使用的是 WinAPI)
      猜你喜欢
      • 2011-05-13
      • 2018-02-07
      • 1970-01-01
      • 2018-01-26
      • 2013-12-11
      • 2018-01-12
      • 1970-01-01
      • 2020-05-06
      相关资源
      最近更新 更多