Побитовые операции с шортами в C # - Почему приведение к int? - PullRequest
6 голосов
/ 19 января 2011
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.

1 Ответ

0 голосов
/ 19 января 2011

Ответ на этот вопрос в другом ответе (даже если вопрос совсем другой) принадлежит самому Эрику Липперту.

Взгляните Целочисленное суммирование синей, короткая + = короткая задача

...