С# Побитовые операции с шортами - зачем приводить к int?

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.


person Benjamin Dobell    schedule 19.01.2011    source источник
comment
Я не голосовал за закрытие как дубликат, но это очень похоже на stackoverflow.com/questions/941584   -  person Jon Skeet    schedule 19.01.2011
comment
Возможно, мне следует объяснить, почему я не нахожу ответы на существующие вопросы о сложении актуальными. При добавлении существует возможность переполнения, как и при назначении test2. Я понимаю эти обстоятельства. Однако в двух ситуациях, которые я описал, переполнение невозможно.   -  person Benjamin Dobell    schedule 19.01.2011


Ответы (1)


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

Взгляните на Блюз целочисленного суммирования, короткая += короткая проблема

person Øyvind Bråthen    schedule 19.01.2011
comment
Этот вопрос даже отдаленно не тот же самый, и на него не было помечено ответа. - person Benjamin Dobell; 19.01.2011
comment
@Benjamin: Просто для справки: тот факт, что первоначальный спрашивающий не решил принять ответ, не означает, что на него не ответили. Многие люди просто никогда не доходят до этого или не понимают, что должны. Обычно вы можете больше сказать о качестве конкретного ответа по количеству голосов, полученных от сообщества, а не по тому, принят он или нет. - person Cody Gray; 19.01.2011
comment
Важная часть этого ответа заключается в том, что в нем говорится обо всех коротких операциях, заканчивающихся как int. Как я уже сказал, вопрос другой, но ответ будет в основном тот же. Этот короткий ‹someoperator› short равен int. - person Øyvind Bråthen; 19.01.2011
comment
@Cody Grey: Это очень верное замечание. Я должен уточнить, что аргументация, приведенная за предлагаемыми ответами в упомянутом вопросе, здесь неприменима. - person Benjamin Dobell; 19.01.2011
comment
@Benjamin - Кстати, если даже отдаленно не то же самое == совсем другое, то, я думаю, у нас есть соглашение;) - person Øyvind Bråthen; 19.01.2011
comment
@Øyvind Knobloch-Bråthen: Извините за путаницу. Я не просто имею в виду, что формулировка, используемая автором упомянутого вопроса, отличается. Я имею в виду, что концепция вопроса Stackoverflow отличается, то есть ответы, комментарии и т. д. не связаны с этим вопросом. Ну, кроме того факта, что оба вопроса обсуждают тонкости синтаксиса С#. - person Benjamin Dobell; 19.01.2011