У меня есть такой код в C++Реализовать функцию из C++ в C# (MAKE_HRESULT - функция Windows)
#define dppHRESULT(Code) \
MAKE_HRESULT(1, 138, (Code))
long x = dppHRESULT(101);
результата является й = -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. Почему?
Я бы очень признателен за помощь, поскольку я застрял с ней.
Не могли бы вы уточнить, что и почему вы изменили? Кажется, эта функция работает, но я не понимаю, почему .. Я буду продолжать ее тестировать. Но на -1 он также возвратил -1 как C++ один –
Конечно. Я решил ради простоты, чтобы вся арифметика оставалась без знака. 'var result = 1U << 31' дает нам тип' uint' из-за суффикса U после значения. Мы только бросаем в конце функции. Поскольку C# будет бросать подгонку, если вы попытаетесь преобразовать целое число без знака в подписанное, если значение вне диапазона (даже если бит идентичны), мы должны использовать 'unchecked', когда мы это делаем. Оба типа ввода - 'uint', потому что они соответствуют типу C' unsigned long'. – SaxxonPike
Спасибо, пожалуйста, просто добавьте это объяснение (возможно, другое также потребуется) вместо ответа. Также, если вы еще раз подчеркнете, почему мой предыдущий подход не работал, это также будет приятно. Как и для новичков, которые не понимают этих сдвигающихся и подписанных против неподписанных проблем. Затем через несколько раз я буду принимать его также, если он не получает плохих голосов –