Почему [1111 1111] представляет как -1, а не 255 в целых числах?
Я делаю замену знака числа в соответствии с правилом: инвертировать бит за битом и добавляю 1, но я работаю с целочисленным типом данных, а не sbyte. Как компилятор понимает, что я меняю знак,
и не вернуть значение 255?
int operand1 = 0, operand2 = 0;
int result;
operand1 = 0x01; // [0000 0001]
result = ~operand1; // [1111 1110]
result++; // [1111 1111]
Console.WriteLine(" ~ {0} + 1 = {1} ", operand1, result);
вывод: " ~ 1 + 1 = -1 "
1 ответ
Решение
Есть целые числа со знаком и без знака. Целые числа со знаком могут содержать отрицательные значения, и поэтому "верхняя" часть диапазона отсчитывается от (0- (int.max / 2)) и вниз.
Смотрите эту статью: https://en.wikipedia.org/wiki/Two%27s_complement
если вы используете Unsigned int, он ведет себя так, как я думаю, вы ожидаете.
В знаковых целочисленных значениях старший бит определяет его отрицательное значение.