安全地将SIZE_T转换为WORD

时间:2017-12-06 11:21:54

标签: c winapi type-conversion

在我的C代码中,我想将SIZE_T WINAPI类型转换为32/64位系统,转换为WORD WINAPI类型。

#include <Windows.h>
SIZE_T nValueToConvert;
WORD wConvertedValue;

如果nValueToConvert对于WORD类型来说太大,我想知道abot并引发错误。最好和最安全的方法是什么?

2 个答案:

答案 0 :(得分:1)

存在很多方法。例如,我们可以使用下一个代码:

if ((wConvertedValue = (WORD)nValueToConvert) == nValueToConvert)
{
    DbgPrint("convert ok\n");
}
else
{
    DbgPrint("too big for WORD\n");
}

但是这仅对无符号类型有效 - SIZE_TWORD都是无符号的。如果使用已签名类型,例如SSIZE_T nValueToConvertSHORT wConvertedValue,则任务变得更加复杂,单独的签名位会在此处产生问题。我认为尝试截断和检查可以通过下一步方式完成:

BOOL Truncate(SSIZE_T nValueToConvert, SHORT* pwConvertedValue)
{
    SHORT wConvertedValue;

    if (0 > nValueToConvert)
    {
        wConvertedValue = -(wConvertedValue = ((SHORT)-nValueToConvert));
    }
    else
    {
        wConvertedValue = (SHORT)nValueToConvert;
    }

    *pwConvertedValue = wConvertedValue;

    return wConvertedValue == nValueToConvert;
}

Truncate在范围SSIZE_T nValueToConvert中的[-0x8000, 0x7FFF]时返回true,否则为false

答案 1 :(得分:1)

转换可能无法给出正确的结果。类型大小不同。检查一下:

Window Data Types

SIZE_T无符号整数类型;定义为:

typedef ULONG_PTR SIZE_T;

WORD 16位无符号整数。范围是0到65535十进制。 此类型在 WinDef.h 中声明如下:

  typedef unsigned short WORD;

但如果你真的想比较它们

if( nValueToConvert > 65535 ) (
{
    DbgPrint("Conversion is not safe\n");
}
else
{
    DbgPrint("conversion is OK\n");
}