Как -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
,