2015-02-25 1 views
-2

Мы знаем, что значение int имеет максимальное значение 2^31 - 1 и минимальное значение -2^31. Если бы мы должны были установить Int до максимального значения:Как непроверено int overflow work C#

int x = int.MaxValue; 

И мы принимаем, что х и добавьте к нему в непроверенной поле

unchecked 
{ 
    x++; 
} 

Тогда мы получим х = минимальное значение междунар. Мой вопрос, почему это происходит и как это происходит в терминах двоичных.

+0

Возможный дубликат [Что такое «Дополнение 2»?] (Http://stackoverflow.com/questions/1049722/what-is-2s-complement) –

+0

@ColeJohnson Я не знал, что это было довольное дополнение 2 до тех пор, пока Теперь. – dxdydsdz

+0

Ребята перестали ненавидеть Я всего лишь в 7 классе и пытаюсь узнать кое-что. ._. – dxdydsdz

ответ

5

В C# встроенные целые числа представлены последовательностью битовых значений предопределенной длины. Для базового типа int длина равна 32 бит. Поскольку 32 бита могут представлять только 4 294 967 296 различных возможных значений (так как это 2^32),

Так как int может содержать как положительные, так и отрицательные числа, знак номера должен быть каким-то образом закодирован. Это делается с первым битом. Если первый бит равен 1, то число отрицательно.

Вот ИНТ значения выложенные на номер строки в шестнадцатеричном и десятичном:

Hexadecimal  Decimal 
----------- ----------- 
0x80000000  -2147483648 
0x80000001  -2147483647 
0x80000002  -2147483646 
    ...    ... 
0xFFFFFFFE    -2 
0xFFFFFFFF    -1 
0x00000000    0 
0x00000001    1 
0x00000002    2 
    ...    ... 
0x7FFFFFFE  2147483646 
0x7FFFFFFF  2147483647 

Как видно из этой таблицы, биты, которые представляют собой наименьшее возможное значение, что вы получили бы добавляя один к наибольшему возможному значению, игнорируя интерпретацию знакового бита. Когда подписанный номер добавляется таким образом, он называется «integer overflow». Независимо от того, разрешено ли целочисленное число или рассматривается ли оно как ошибка, настраивается с проверенными и непроверенными операциями на C#.

Это representation называется 2's complement

Вы можете check this link, если вы хотите пойти глубже.

+0

О, спасибо, теперь это имеет смысл! – dxdydsdz

-2

Int имеет максимальное значение 2^31 - 1, потому что int является псевдонимом для Int32, который хранит 4 байта в памяти для представления значения.

Теперь давайте рассмотрим концепцию int.Max + 1. Здесь вы должны знать о Signed number representations, который используется для хранения отрицательных значений. В представлении двоичного числа нет ничего подобного отрицательным числам, но они представлены дополнением дополнения и двумя битами дополнения.

Допустим, у моего int1 есть память объемом 1 байт, т.е. 8 бит. Таким образом, максимальное значение, которое вы можете сохранить в int1, равно 2^8 -1 = 255. Теперь давайте добавим 1 в эту ценностно

 11111111 
    + 00000000 
    ---------- 
    100000000 

ваш выход 100000000 = (512) в десятичной системе, что выходит за пределы возможностей хранения int1 и что представляет собой отрицательное значение -256 в десятичной системе счисления (как первый бит показывает отрицательное значение).

Это причина добавления 1 к int.Max стать, int.Minimum. то есть.

`int.Maximum + 1 = int.Minimum` 
-2

Хорошо, я собираюсь предположить ради удобства, что в C# существует 4-битный целочисленный тип. Самый старший бит используется для хранения знака, остальные три используются для хранения величины.

Максимальное количество, которое может быть сохранено в таком представлении, равно +7 (положительный 7 в базе 10). В двоичном, это:

0111 

Теперь давайте добавим положительную одно:

0111 
+0001 
_____ 
1000 

Упс, что перенесенный из величин и перевернутый знаковый бит! Сумма, которую вы видите выше, фактически равна числу -8, наименьшему возможному числу, которое может быть сохранено в этом представлении. Если вы не знакомы с two's complement, то, как цифры с цифрами обычно представлены в двоичном формате, вы можете подумать, что число отрицательно равно нулю (что было бы в случае с представлением sign and magnitude). Вы можете прочитать дополнение к двум, чтобы понять это лучше.

+0

Не мог бы кто-нибудь объяснить, что я здесь не так понял? –

+0

Спасибо, это очень хорошее, короткое объяснение! Идк, почему другие люди проголосовали ... – dxdydsdz