Для сложения, умножения и вычитания есть довольно хорошее объяснение: включить биты переноса в вычисление и затем выбросить их гораздо проще, чем вычислить биты переноса, если они были выброшены изначально.
Для побитовых операторов (пересечение, включающее объединение, исключительное объединение, дополнение) эти рассуждения просто не выдерживают критики. Единственное, о чем я могу думать, это то, что расширение знака будет несколько двусмысленным, если вы начнете со смеси операндов со знаком и без знака, а затем сохраните результат в более широком виде. Но это не объясняет, почему побитовые операции, которые являются унарными или где все операнды имеют одинаковый тип, должны расширять результат до int
. Я считаю это очень раздражающим недостатком дизайна в C #, который:
byte a, b;
byte c = a | b;
генерирует ошибку.