Это потому, что .NET использует два дополнения, а не знаковое значение. Чтобы отрицать, вы должны перевернуть все биты, а затем добавить один.
Пожалуйста, просто используйте унарный минус. Пожалуйста ... Довольно пожалуйста.
РЕДАКТИРОВАТЬ: Если по какой-то странной причине вам пришлось делать это с побитовыми операциями, вы должны сделать это:
Dim somewhatCorrect = (Short.MaxValue xor Short.MinValue) + 1;
что, конечно, все еще не является побитовым, потому что отрицание дополнения до двух не может быть эффективно сделано с побитовыми операторами.
EDIT2: А вот унарный минус:
Dim correct = -Short.MaxValue;
РЕДАКТИРОВАТЬ3: В ответ на отредактированный вопрос :
Dim x As Short = 42
Dim xWithHighBitOn = x Or Short.MinValue