在我的C代码中,我想将SIZE_T
WINAPI
类型转换为32/64位系统,转换为WORD
WINAPI
类型。
#include <Windows.h>
SIZE_T nValueToConvert;
WORD wConvertedValue;
如果nValueToConvert
对于WORD
类型来说太大,我想知道abot并引发错误。最好和最安全的方法是什么?
答案 0 :(得分:1)
存在很多方法。例如,我们可以使用下一个代码:
if ((wConvertedValue = (WORD)nValueToConvert) == nValueToConvert)
{
DbgPrint("convert ok\n");
}
else
{
DbgPrint("too big for WORD\n");
}
但是这仅对无符号类型有效 - SIZE_T
和WORD
都是无符号的。如果使用已签名类型,例如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
答案 1 :(得分:1)
转换可能无法给出正确的结果。类型大小不同。检查一下:
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");
}