Поразрядные операции C # на шортах - зачем приводить к типу int?

short BitwiseTest(short value)
{
    short test1 = ((value >> 8) & 0xFF);
    short test2 = unchecked((short)((value << 8) & 0xFF00));
    return (test1 | test2);
}

Приведенный выше код должен быть (неэффективным) примером, который меняет порядок байтов короткого (16-разрядного целого числа со знаком) в C #.

Однако приведенный выше код не будет компилироваться, потому что C # неявно преобразует короткие значения в 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.

7
задан Benjamin Dobell 19 January 2011 в 14:36
поделиться