Как -128 вписывается в сбыт

Как я помню, мы узнали, что целочисленные типы со знаком (sbyte, short, int, long) первый бит для знака, а последний 7-бит для значения.

Я видел, что диапазон sbyte составляет от -128 до 127, в то время как я думал, что это должно быть от -127 до 127.

Я попробовал несколько кодов, чтобы понять, как это возможно, и я столкнулся с двумя странными вещами:

1- Я попробовал следующий код:

sbyte a = -128;
Console.Write(Convert.ToString(a, 2));

и результат был

1111111100000000

Как будто это двухбайтовая переменная.

2-попытался преобразовать все числа в диапазоне в двоичную форму:

for(sbyte i=-128;i<=127;i++)
{
    Console.WriteLine(Convert.ToString(i, 2));
    if(i==127) break;
}

Если я опущу if(i==127) break; цикл продолжается. и с разрывом код в цикле не выполняется, как-бы как -128 больше 127.

Мой вывод: поскольку я думал, что -128 не должен помещаться в байтовую переменную без знака, и первая и вторая попытки подтверждают это (111111110000000> 01111111), но если он не подходит, то почему диапазон составляет от -128 до 127?

1 ответ

я видел это sbyte диапазон -128 в 127 в то время как я думал, что это должно быть -127 в 127,

Диапазон [-128, +127] в самом деле. Диапазон [-127, +127] будет означать, что sbyte может представлять только 255 разные значения, в то время как 8 бит составляют 256 комбинации.

И кстати, если -128 не будет юридической ценностью, компилятор будет жаловаться на

sbyte a = -128;

Нет перегрузки Convert.ToString(sbyte value, int toBase)так в твоем случае Convert.ToString(int value, int toBase) называется, и sbyte повышен до int,

Чтобы быстро проверить значение, вы можете распечатать sbyte как шестнадцатеричное число:

sbyte s = -1;
Console.WriteLine("{0:X}", s); // FF, i.e. 11111111

Если я опущу if(i==127) break; цикл продолжается.

Конечно, sbyte.MaxValue является 127, так i<=127 всегда true, когда i является 127 и увеличивается, происходит переполнение и следующее значение -128,

Другие вопросы по тегам