在我的 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_T
和WORD
都是未签名的。如果使用signed 类型,例如SSIZE_T nValueToConvert
和SHORT 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
关于c - 安全地将 SIZE_T 转换为 WORD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47673109/