Побитовый оператор "~" в C # - PullRequest
13 голосов
/ 25 июля 2011

Рассмотрим код этого модульного теста:

    [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. Почему это?

Ответы [ 2 ]

15 голосов
/ 25 июля 2011

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

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

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

3 голосов
/ 25 июля 2011

Потому что ~ возвращает int. См. ~ Оператор (C # Reference) (MSDN)

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

существует неявное приведение.
...