2013-09-01 2 views
13

왜 데이터 형식의 범위가 양수 쪽과 비교할 때 음수 쪽이 더 큽니까?int의 범위가 -32768에서 32767 인 이유는 무엇입니까?

예를 들어, 정수의 경우 :

터보 C 그 범위 32767--32768비주얼 스튜디오 것이 2147483647--2147483648이다. 동일한 다른 데이터 유형에 미치는

...

가 가

[UPD는 : 비주얼 스튜디오에 대한 적절한 한계 값을 설정] 2S 함께

+4

어디에서 0을 넣으시겠습니까? – Shomz

+16

http://en.wikipedia.org/wiki/Two's_complement –

+0

0도 저장해야하기 때문에! – GC268DM

답변

31

부호 번호 것을 사용 저장된 호출^"2의 보수 표기법"

모든 변수는 특정 양의 비트를 가지고 있음을 기억하십시오. 왼쪽에서 가장 중요한 부호가 0이면 숫자가 음수가 아닙니다 (즉, 양수 또는 음수). 0)이고, 나머지 비트는 단순히 값을 나타냅니다.

그러나 가장 왼쪽의 비트가 1이면 음수입니다. 숫자의 실제 값은 subtrac 표현 된 전체 수 (부호없는 수량, 가장 왼쪽 1 포함)에서 2^n을 쓴다. 여기서 n은 변수의 비트 수이다.

숫자의 실제 값 ("가수")에 대해 n - 1 비트 만 남았으므로 가능한 조합은 2^(n - 1)입니다. 0에서 2^(n - 1) - 1로 이동합니다. -1은 0을 자체로 계산하는 것입니다. 예를 들어, 가능한 조합이 4 개인 경우, 해당 조합 0, 1, 2 및 3을 나타냅니다 (네 개의 숫자가 있음을 알 수 있습니다). 0에서 4 - 1로 이동합니다.

음수의 경우 가장 왼쪽 비트가 1이므로 2로 표시됩니다^(n - 1)과 (2^n) - 1 (괄호는 매우 중요합니다!). 그러나, 내가 말했듯이, 숫자의 실제 가치를 얻으려면 2^n 걸려야합니다. 2^n은 - (2^(n - 1))이고 ((2^n) - 1) - 2^n은 -1이다. 따라서 음수의 범위는 - (2^(n - 1)) ~ -1입니다.

모든 것을 합치면 -2^(n - 1) - 1이됩니다. 보시다시피, 상한값은 하한값이 -1이됩니다.

그래서 긍정적 인 것보다 하나 더 많은 음수가 있습니다.

0

음수가 비트 단위로 정의 편안하지 더하기 1이 감소 지정된 수의 비트에서 가능한 수의 범위를 음수 측에서 1 씩 늘립니다.

0

범위에 0이 포함되어 있기 때문에. n 비트 정수가 표현할 수있는 다른 값의 수는 2^n입니다. 이는 16 비트 정수가 65536 개의 서로 다른 값을 나타낼 수 있음을 의미합니다. 부호없는 16 비트 정수이면 0-65535를 포함 할 수 있습니다. 부호있는 정수의 규약은 -32768 ~ 32767, -214748368 ~ 214748367 등을 나타냅니다.

+0

왜이 응답을 downvote 것입니다 ? 가장 완전하고 자세한 대답은 아닐지 모르지만 전적으로 정확합니다. –

0

일반적으로 음수 값을 저장하기 위해 2의 보수 시스템을 사용하기 때문에 부호 비트를 정수로 대칭하면 편향됩니다. 부정.

범위이어야한다 : -. (2^(N-1)) - ((2 (N-1) -1) 때문에 번호가 저장되는 방법

14

C가 요구하는 최소 범위는 실제로 C 표준에서 허용하는 음수에 대한 2의 보수, 1의 보수 및 부호/크기 인코딩을 처리해야하기 때문에 실제로 -32767에서 32767입니다. 데이터 유형의 최소 범위에 대한 자세한 내용은 C11 (및 C99)의 Annex E, Implementation limits을 참조하십시오.

귀하의 질문은 2의 보수 변형에만 해당되며 그 이유는 간단합니다. 16 비트로 2 (또는 65,536)의 다른 값을 나타낼 수 있으며 그 중 하나는 0이어야합니다. 따라서이 왼쪽 값의 홀수, 그 중 (하나) 대부분이 음의 값은 다음과 같습니다

1 thru 32767 = 37267 values 
0    =  1 value 
-1 thru -32768 = 32768 values 
        ----- 
        65536 values 

두 사람 '보완 및 인코딩 진도에 서명 긍정적 인뿐만 아니라 (네거티브 제로 값을 허용 -0)입니다. 즉, 0이 아닌 숫자에 대해 더 적은 비트 패턴을 사용할 수 있으므로 표준에서 찾은 최소 범위가 줄어 듭니다.

1 thru 32767 = 37267 values 
0    =  1 value 
-0    =  1 value 
-1 thru -32767 = 32767 values 
        ----- 
        65536 values 

2의 보수는 실제로 단순한 하드웨어와 함께 양수 및 음수를 추가 할 수 있기 때문에 실제로는 멋진 인코딩 체계입니다. 다른 인코딩 체계는 동일한 작업을 수행하기 위해보다 정교한 하드웨어를 요구하는 경향이 있습니다.

어떻게 2의 보수가 작동하는지에 대한 자세한 설명은 wikipedia page을 참조하십시오.