2015-11-19 2 views
-1

Я пытаюсь понять, почему INT_MIN равен -2^31 - 1, а не только -2^31.Почему абсолютная величина INT_MIN отличается от INT MAX?

Я понимаю, что int является 4 bytes = 32 bits. Из этих 32 bits, я полагаю, 1 bit используется для знака +/-, оставляя 31 bits для фактического значения. Таким образом, INT_MAX равен 2^31-1 = 2147483647. С другой стороны, почему INT_MIN равен -2^31 = -2147483648? Разве это не превысит «4 байта», выделенных для int? Основываясь на моей логике, я ожидал бы INT_MIN равным -2^31 = -2147483647

+0

есть «2^32» возможные способы установки 32 бит. Если вы не хотите тратить никого из них, то это диапазон с четным количеством элементов в нем. Однако диапазон от -X до X (для некоторого числа X) имеет нечетное число элементов. –

+0

Система, которую вы описываете (которая называется * знак-величина *), уничтожает случай знака-бита 1 и всех остальных битов 0. Раньше некоторые компьютеры использовали эту систему в любом случае, но сейчас это редко. –

+0

То, что вы описываете, - это [система знаков знака и величины] (https://en.wikipedia.org/wiki/Signed_number_representations#Signed_magnitude_representation). Это работает нормально, но означает, что вы можете иметь '+ 0' и' -0'. Так что почти все компьютеры используют [два дополнения] (https://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement), потому что есть только один '0' (он не является ни положительным, ни отрицательным, просто нулевым), и это имеет некоторые удобные последствия, когда речь идет о двоичной арифметике. – Cornstalks

ответ

0

Большинство современных систем используют two's complement для представления целочисленных типов данных со знаком. В этом представлении одно состояние в положительной стороне используется для представления нуля, поэтому одно положительное значение меньше отрицательных. На самом деле это одно из главных преимуществ этой системы над системой sign-magnitude, где нуль имеет два представления, +0 и -0.

Давайте возьмем небольшой тип данных, скажем шириной 4 бита, чтобы понять это лучше. Число возможных состояний с этим целым типом игрушки было бы равно 2⁴ = 16 состояний. При использовании двух дополнений для представления числа со знаком мы имели бы 8 отрицательных и 7 положительных чисел и ноль.

Bin Dec 
0000 = 0 
0001 = 1 
0010 = 2 
0011 = 3 
0100 = 4 
0101 = 5 
0110 = 6 
0111 = 7 
1000 = -8 
1001 = -7 
1010 = -6 
1011 = -5 
1100 = -4 
1101 = -3 
1110 = -2 
1111 = -1 

Я думаю, вы сбиты с толку, так как вы воображаете, что знак знаковой величины используется для подписанных чисел; хотя это также допускается языковыми стандартами, эта система с меньшей вероятностью будет реализована, поскольку система комплемента двух значительно лучше отражает представление.