0

我需要将 HRESULT 值作为命令行参数传递给程序。我本来打算通过传递十六进制值来做到这一点,例如:

>receiver.exe 0x80048836

我正在尝试将此字符串表示形式转换回 HRESULT 使用wcstol,例如:

HRESULT hr = wcstol(argv[2], NULL, 16);

但是,原始 HRESULT 的值通常大于LONG_MAX,因此在上面的行中hr以 结束0x7fffffff

所以,两个问题:

  1. 我以为 HRESULTS 只是 32 位整数?所以我不确定我是如何得到一个大于LONG_MAX. 不过,它似乎在原始程序中运行良好(即 HRESULT 不会溢出)。

  2. 有没有办法绕过LONG_MAX限制wcstol?也许与 HRESULT 实际大小的整数相匹配的另一个版本的函数?

谢谢!

4

2 回答 2

3

退房wcstoulhttp://msdn.microsoft.com/en-us/library/5k9xb7x1(v=VS.80).aspx HRESULT 确实适合 32 位,但是在您给出的示例中,它使用了最高有效位,这被认为是充当有符号整数的符号位。使用wcstoul会将其放入无符号长整数中。

LONG_MAX0x7FFFFFFF,可以容纳在 31 个最低有效位中的最高位,使最高位清零,但由于它是无符号的,所以ULONG_MAX上升到。0xFFFFFFFF

于 2010-10-28T20:43:07.497 回答
0

0x80048836 大于系统的 LONG_MAX (2147483647L),即 (0x7FFFFFFF)。根据 msdn “当表示会导致溢出时,在这种情况下它返回 LONG_MAX 或 LONG_MIN”

因此,在您的情况下,您会得到 LONG_MAX 作为结果返回。

实际的函数返回类型声明为 long wcstol(...)。long 的大小不一定是 32 位,这取决于您的系统。

在这种情况下,返回类型是有符号的 32 位,因此适合 32 位的最大有符号整数是 7FFFFFFF。
00000000 到 7FFFFFFF 从 0 到 LONG_MAX 为正 FFFFFFFF 到 8000001 从 -1 到 LONG_MIN 为负

顺便说一句,我相信“HRESULT hr = wcstol ...”是不正确的,因为 wcstol 的返回类型是 (signed) long ,但 HRESULT 是 ULONG (unsigned long)。这可能是一个问题,具体取决于您如何使用该数据。

于 2010-10-28T20:58:17.123 回答