Подтвердить что ты не робот

Побитовый оператор "~" в С#

Рассмотрим этот unit test код:

    [TestMethod]
    public void RunNotTest()
    {

        // 10101100 = 128 + 32 + 8 + 4 = 172
        byte b = 172;

        // 01010011 = 64 + 16 + 2 + 1 = 83
        Assert.AreEqual(83, (byte)~b);
    }

Этот тест проходит. Однако без байта он не работает, потому что оператор "~" возвращает значение -173. Почему это?

4b9b3361

Ответ 1

Продвижение до int происходит на byte, потому что для них не определено двоичное дополнение.

См. Унарные числовые рекламные акции и Оператор побитового дополнения.

Изначально, когда вы вызываете ~ по значению без знака 8 бит 10101100, оно повышается до 32-разрядного значения знака 0...010101100. Его дополнением является 32-битное значение 1...101010011, которое равно -173 для int. Приведение этого результата в byte является понижением к 8-битовому значению без знака 01010011, теряющему самые значительные 24 бита. Конечный результат интерпретируется как 83 в представлении без знака.

Ответ 2

Потому что ~ возвращает int. См. ~ Оператор (ссылка на С#) (MSDN)

Это только предопределено для int, uint, long, and ulong - поэтому при использовании его на byte существует неявный приведение.