Мне интересно, почему максимально возможное значение Int32 в.NET равно 2147483647, но не 2147483648. Поскольку 2³¹ = 2147483648.
спасибо
Int32
хранится в 32 битах, а не 31 бит, а половина его диапазона принимается отрицательными числами. Из оставшегося диапазона вы теряете одно значение до нуля, оставляя 2147483647 наивысшим положительным числом.
Диапазон для Int32 - -2147483648 до 2147483647.
2^8
или 256 значений. Мы помещаем ровно половину из них ( 2^7
или 128), на отрицательную сторону нуля, ноль берет один, а другую половину мы переводим с нуля. Поскольку ноль занимает единицу, у нас остается 2^7-1
положительных чисел или 127. Это можно расширить до 32-разрядных, где мы получим 2^31-1
положительных чисел. Другие числовые представления также могут иметь -0 и +0.
Фактические данные Int32 хранятся в 31 бит, так как обычный Int32 также должен содержать отрицательные числа, 1 бит используется как знаковый бит, а 31 бит, которые остаются, используются в качестве данных. Однако, если вы используете неподписанный Int32, тогда у вас будет полное 32 бита данных.
Он также включает нуль 0
в положительном диапазоне. Следовательно, диапазон от 0
до 2147483647
и так как нуль рассматривается в положительной стороне, следовательно, в сторону отрицательной стороны от -1 до -2147483648
.
Таким образом, общая положительная и отрицательная стороны принимают равное количество значений.
Это означает, что int
может иметь максимум 2147483648
положительных значений, начиная с 0
до 2147483647
, int.Min
-2, 147 483 648, поскольку он не включает 0
sbyte
переходит от -128 до 127. Подумайте над этим примером на некоторое время, потому что легче рассмотреть небольшие числа. Подумайте, сколько разных чисел представлено в диапазоне[-128, 127]
...2^31 = 10000000000000000000000000000000
который нельзя использовать в качестве начального бита для знака. Так на один меньше (11111111111111111111111111111111111
).