short BitwiseTest(short value)
{
short test1 = ((value >> 8) & 0xFF);
short test2 = unchecked((short)((value << 8) & 0xFF00));
return (test1 | test2);
}
Вышеприведенный код должен быть (неэффективным) примером, который сводит континент короткого (подписанного 16-битного целого) в C#.C# Побитовые операции на шортах - зачем бросать в int?
Однако приведенный выше код не будет компилироваться, так как C# неявно литьем из короткого к междунар на обоих из следующих строк:
Первый случай:
short test1 = ((value >> 8) & 0xFF);
Второй случай:
return (test1 | test2);
Почему этот актер проходит? Смогу ли я достичь ожидаемого результата, просто вернувшись к короткому? Например:
short BitwiseTest2(short value)
{
short test1 = (short)((value >> 8) & 0xFF);
short test2 = unchecked((short)((value << 8) & 0xFF00));
return ((short)(test1 | test2));
}
Если нет, то почему?
Обратите внимание, что я понимаю, почему C# выполняет короткое замыкание на целое число при выполнении левого сдвига бит, следовательно, назначение переменной test2.
Я не голосовал, чтобы закрыть как дубликат, но это значительно похоже на http://stackoverflow.com/questions/941584 –
Может быть, я должен объяснить, почему я не нахожу ответы к существующим вопросам о дополнении. С добавлением есть возможность переполнения, так же как и с назначением test2. Я понимаю эти обстоятельства. Однако в двух ситуациях, которые я изложил, нет возможности переполнения. –