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

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

如果nValueToConvert对于WORD类型来说太大,我想知道它并提出一个错误。做这件事的最好和最安全的方法是什么?

最佳答案

存在许多方法来做到这一点。例如,我们可以使用下一个代码:

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;
}

TruncateSSIZE_T nValueToConvert范围内时返回true,否则返回false

07-24 13:53