c - 安全地将 SIZE_T 转换为 WORD

标签 c winapi type-conversion

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

#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");
}

然而,这仅对unsigned 类型有效——SIZE_TWORD 都是未签名的。如果使用signed 类型,例如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[-0x8000, 0x7FFF] 范围内时返回 true,否则返回 false

关于c - 安全地将 SIZE_T 转换为 WORD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47673109/

相关文章:

c++ - 停止针对 GLIBC 将 strftime 转换为 __strftime_l 的链接

c - reverseList 函数不在队列中工作

c - 如何为 CreateProcess() 启动的进程设置语言环境

javascript - 将数字拆分为数组的方法

通过 fifo 队列 linux 进行通信

c - 如何在头文件中声明管道? (在C中)

c++ - 如何在Win32中正确调用HeapSummary API?

c++ - 从 WinAPI 中的编辑窗口正确提取 int 以进行逻辑测试

c# - 将 SqlDataReader 传递为用作转换的参数

c++ - 将 C 字符串转换为单个整数