gpt4 book ai didi

c# - 在 C# 中从 C++ 实现函数(MAKE_HRESULT - Windows 函数)

转载 作者:行者123 更新时间:2023-11-28 02:18:50 31 4
gpt4 key购买 nike

我有这样的C++代码

#define dppHRESULT(Code) \
MAKE_HRESULT(1, 138, (Code))

long x = dppHRESULT(101);

结果为 x = -2138439579。

MAKE_HRESULT 是一个窗口函数,定义为

#define MAKE_HRESULT(sev,fac,code) \
((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) )

我需要在 C# 中复制它。所以我写了这段代码:

  public static long MakeHResult(uint facility, uint errorNo)
{
// Make HR
uint result = (uint)1 << 31;
result |= (uint)facility << 16;
result |= (uint)errorNo;

return (long) result;
}

然后这样调用:

    // Should return type be long actually??
long test = DppUtilities.MakeHResult(138, 101);

但是我得到了不同的结果,test = 2156527717。

为什么?有人可以帮我在 C# 中复制那个 C++ 函数吗?这样我就可以在类似的输入上得到类似的输出?


替代实现。

如果我使用这个实现

  public static long MakeHResult(ulong facility, ulong errorNo)
{
// Make HR
long result = (long)1 << 31;
result |= (long)facility << 16;
result |= (long)errorNo;

return (long) result;
}

这适用于输入 101。但是如果我输入 -1,那么 C++ 返回 -1 作为结果,而 C# 返回 4294967295。为什么?

我真的很感激一些帮助,因为我一直坚持下去。

最佳答案

我已将该函数重写为 C# 等效函数。

static int MakeHResult(uint facility, uint errorNo)
{
// Make HR
uint result = 1U << 31;
result |= facility << 16;
result |= errorNo;

return unchecked((int)result);
}

C# 对有符号/无符号转换更为严格,而原始 C 代码对此没有任何关注。混合使用有符号和无符号类型通常会让人头疼。

正如 Ben Voigt 在他的回答中提到的,两种语言在类型命名方面存在差异。 C中的long实际上是C#中的int。它们都指的是 32 位类型。

1U 中的 U 表示“这是一个无符号整数”。 (简要回顾:有符号类型可以存储负数,无符号类型不能。)该函数中的所有算术运算都是无符号的,最后的值只是简单地转换为有符号的值。这是最接近发布的原始 C 宏的近似值。

unchecked 在这里是必需的,否则 C# 将不允许您转换超出目标类型范围的值,即使位相同也是如此。如果您不介意处理负数时值不同,则通常需要在有符号和无符号之间切换。

关于c# - 在 C# 中从 C++ 实现函数(MAKE_HRESULT - Windows 函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33216607/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com