short BitwiseTest(short value)
{
short test1 = ((value >> 8) & 0xFF);
short test2 = unchecked((short)((value << 8) & 0xFF00));
return (test1 | test2);
}
Предполагается, что приведенный выше код является (неэффективным) примером, который меняет порядок следования байтов на короткое (16-разрядное целое число со знаком) в C#.
Однако приведенный выше код не будет компилироваться, потому что C# неявно выполняет преобразование из типа short в тип int в обеих следующих строках:
Первый случай:
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.