왜 int, doubles 등의 최소값이 0보다 양수 값보다 먼가요?


10

2의 보수와 1을 더하는 것과 관련이 있다는 것을 알고 있지만 음수와 관련하여 동일한 양의 비트로 하나 이상의 숫자를 인코딩하는 방법을 실제로 얻지 못합니다.


3
이것의 가장 불쾌한 부분은 Abs (MinValue)가 음수라는 것입니다.
OldFart

1
java Double.MIN_VALUE는 가장 작은 양수 값이며, 0에서 가장 먼 (실제) 숫자는 같은 크기를가집니다 (적절한 부호 비트를 가짐)
ratchet freak

답변:


16

이 용어로 생각하십시오. 앞에 부호가있는 2 비트 숫자를 사용하십시오.

000 = 0
001 = 1
010 = 2
011 = 3

이제 몇 가지 부정적인 점을 보자.

111 = -1
110 = -2
101 = -3

잠깐만, 우리는 또한

100 ... 

부호 비트가 1이므로 음수 여야합니다. 따라서 논리적으로 -4 여야합니다.

(편집 : WorldEngineer가 올바르게 지적했듯이 모든 번호 매기기 시스템이 이러한 방식으로 작동하는 것은 아니지만 요청하는 시스템이 작동합니다.)


11

정수 범위에는 두 개의 클래스가 없지만 음수, 0 및 양수의 세 가지 클래스가 있기 때문입니다. 0은 슬롯을 차지해야합니다 (0을 나타낼 수없는 것은 비실용적입니다 ...). 긍정적이거나 부정적인 클래스는 슬롯을 포기해야합니다. 일반적으로 희생이 긍정적 인 범위라는 사실은 어느 정도까지는 임의적이지만, 비트 조작 수준에는이 결정이 더 편리하게 만드는 것들이 있습니다.


비트 조작 만이 아닙니다. 32 비트 부호있는 숫자의 집합은 이진 표현이 31 일 이후의 모든 비트에서 동일한 값을 갖는 숫자의 집합이며, 그러한 숫자 중 하나는 무한한 1의 집합과 31 개의 0을 갖습니다. 1의 1과 31의 0으로 끝나는 무한 문자열 인 그 숫자의 역수는 부호있는 값에 필요한 패턴에 맞지 않습니다.
supercat

4

부호있는 정수를 이진수로 표현하는 기본적으로 세 가지 방법이 있습니다 : 2의 보수, 1의 보수 및 부호 크기. (Biquinary는 오래 전에 Dodo Bird의 길을 갔다.)

1의 보수와 부호 크기에는 각각 고유 한 표현을 가진 +0과 -0의 두 개의 0 값이 있습니다. 2의 보수는 하나의 0 값과 하나의 표현만을 갖습니다.

이제, N 비트의 필드는 2 ^ N 값을 인코딩 할 수있다. 2의 보수에서 1을 빼면 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1입니다. 0에 대한 표현은 모두 0 비트이고 + 부호는 0이므로 부호 비트가 1로 설정된 0이 아닌 가능한 표현이 하나 더 있습니다.

이것은 2의 보수가-(2 ^ (N-1)) .. + (2 ^ (N-1)-1) 범위의 값을 나타내는 매우 긴 방법입니다.

정수 디지털 신호 처리 계산을 수행하는 경우 1의 보수는 실제로 2의 보수보다 이점이 있습니다. 1의 보수 연산은 본질적으로 0으로 잘립니다. 2의 보수는-무한으로 잘립니다. 나는 이것을 열심히 배웠다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.