2012-10-30 6 views
2

:물결표 C 예를 들어

unsigned int i = ~0; 

결과는 : -1

,691 : 최대 수는 내가 i

signed int y = ~0; 

결과에 할당 할 수있는

-1이 나옵니까? y에 할당 할 수있는 최대 숫자를 가져야하지 않습니까?

+2

~ 연산자가 무엇을하는지 알고 있습니까? –

+1

음,'-1'은 정수에 넣을 수있는 최대 수입니다. 그러나 _maximum_는 절대 이진 값으로 정의됩니다. –

답변

6

모두 4294967295 (일명 UINT_MAX) 및 -1는 모두 1 설정 0xFFFFFFFF 또는 32 비트와 동일한 이진 표현이있다. 이는 부호가있는 숫자가 two's complement을 사용하여 표현 되었기 때문입니다. 음수는 1으로 설정된 MSB (최상위 비트)와 그 나머지 비트를 뒤집어서 1을 더하고 -1을 곱하여 결정됩니다. 따라서 MSB를 1으로 설정하고 나머지 비트도 1으로 설정하면이 값을 뒤집어서 (즉, 0을 얻습니다) 1 (1)을 곱한 다음 -1을 곱하면 -1이됩니다.

이렇게하면 CPU가 음수에 대한 특별한 예외가 필요하지 않으므로 수학을 쉽게 수행 할 수 있습니다. 예를 들어 0xFFFFFFFF (-1) 및 1을 추가하십시오. 32 비트의 공간 만 있기 때문에 오버플로되며 예상대로 결과는 0이됩니다.

http://en.wikipedia.org/wiki/Two%27s_complement

4

~0은 모든 비트가 1로 설정된 경우에만 int입니다. unsigned으로 해석하면 UINT_MAX과 같습니다. signed으로 해석하면 -1이됩니다.

가정 32 비트의 int :

0 = 0x00000000 = 0 (signed) = 0 (unsigned) 
~0 = 0xffffffff = -1 (signed) = UINT_MAX (unsigned) 
+0

고맙겠지 만 0xffffffff가 -1 인 이유는 무엇입니까? – user1365914

+0

~ 0 = 0xffffffff = -1 (부호있는, -1의 2의 보수 형식). 모든 시스템이 이러한 접근 방식을 따르고 있습니까? – SparKot

+0

할당은 재 해석이 아니라 값 변환 :'unsigned int'에 할당되었을 때'~ 0'은'int''' -'0''이'-1'을 나타내는 경우에만 UINT_MAX를 산출합니다 – Christoph

1

아니 ~비트 NOT 연산자 입력 연산자 아닌 최대 값이기 때문이다. ~0int에 해당하며 모든 비트는 1으로 설정되며 서명되지 않은 것으로 해석되는 최대 숫자는 부호없는 int로 해석되며 -1로 표시됩니다.

0

two's complement 기계에 있어야합니다.

+0

대체 시스템에 대한 간략한 설명과 오늘 사용되지 않는 방법 : http://en.wikipedia.org/wiki/Ones%27_complement#History – hyde

+0

C 언어는 기본 하드웨어를 기준으로 2의 보수 및 부호 크기 표현을 허용하므로 완전히 사용되지는 않습니다. 다른 표현 중 하나를 사용하는 하드웨어 기반 요소 (속도 또는 비용)가있는 경우 다시 올 것이라고 확신합니다. – ldav1s

2

바울의 대답은 절대적으로 옳다 :

은 더를 참조하십시오.

#include <limits.h> 

signed int y = INT_MAX; 
unsigned int x = UINT_MAX; 

을 그리고 지금은 값을 확인하는 경우 : 대신 0 ~를 사용하여, 당신은 사용할 수있는 시스템에 당신이 최대 값을 볼 수 있습니다

printf("x = %u\ny = %d\n", UINT_MAX, INT_MAX); 

.

5
unsigned int i = ~0; 

결과 : 최대 수는 내가에 난 보통

, 그러나 반드시 할당 할 수 있습니다. ~0이라는 표현식은 모든 (채워지지 않은) 비트가 설정된 int으로 평가됩니다. C 표준은 부호있는 정수에 대한

  • 2의 보수를, 세 가지 표현을 허용하는 경우 ~0 = -1(-1) + (UINT_MAX + 1) = UINT_MAXunsigned int 결과가 할당된다.
  • '의 경우, ~0은 음수 0 또는 트랩 표현입니다. 그것은 unsigned int을 그 않을 경우 1이다 (UINT_MAX + 1) - INT_MAXunsigned int 결과에 할당 부정적인 경우 ~0INT_MIN == -INT_MAX 인 제로, 0
  • 로그인 및 진도에 unsigned int 결과에 할당하고, 만약 unsigned int의 폭이 일반적인 경우에 int2^(WIDTH - 1) + 1보다 작은 폭 (부호없는 정수 유형의 값 비트 수, 부호있는 정수 유형의 경우 부호 비트의 수 +1)이 있습니다. 너비는 int입니다.

초기화

unsigned int i = ~0u; 

는 항상 값 UINT_MAX을 들고 i가 발생합니다.

signed int y = ~0; 

결과 : -1

위에서 언급 한 바와 같이, 부호있는 정수의 표현은 (현재까지 가장 일반적인 표현입니다) 2의 보수를 사용하는 경우에만.

0

http://en.wikipedia.org/wiki/Two%27s_complement을 찾아보고 부울 대수와 논리 디자인에 대해 알아보십시오. 또한 이진수로 계산하는 방법과 이진수로 덧셈과 뺄셈을 학습하면 더 자세히 설명 할 수 있습니다.

C 언어는이 형식의 숫자를 사용하므로 0x7FFFFFFF를 사용하는 데 필요한 최대 숫자를 찾습니다. (사용되는 각 바이트에 대해 2 FF를 사용하고 가장 왼쪽 바이트는 7입니다.) 이것을 이해하려면 16 진수와 그 작동 방식을 찾아야합니다.

이제 부호없는 동등 물을 설명하십시오. 부호있는 숫자에서 숫자의 아래쪽 절반은 음수입니다 (0은 양수로 표시되므로 음수는 실제로 양수보다 1 씩 증가 함). 부호없는 숫자는 모두 양수입니다. 이론적으로 32 비트 정수의 가장 높은 숫자는 2^32입니다. 0은 여전히 ​​양수로 계산되므로 실제로 2^32-1입니다. 이제 부호있는 숫자의 절반은 음수입니다.즉, 앞의 2^32를 2로 나누는 것을 의미합니다. 32는 지수이고 양수는 2^31입니다. 양수가 0이면 부호있는 32 비트 정수의 범위는 (-2^31, 2^31- 1).

이제 단지 비교 범위 : 부호없는 32 비트 INT : (0, 2^32-1) 32 비트 INT 서명 (-2^31, 2^32-1) 부호없는 16 비트 INT (0 , 2^16-1) 부호있는 16 비트 int : (-2^15, 2^15-1)

여기서 패턴을 볼 수 있습니다. ~ 0 가지를 설명하는 데에는 조금 더 많은 시간이 걸리고, 이것은 바이너리에서 뺄셈과 관련이 있습니다. 1을 더하고 모든 비트를 뒤집은 다음 두 숫자를 더하는 것입니다. C가 당신을 위해이 일을 처리하기 때문에 x86 및 x64 프로세서 라인을 포함하여 많은 프로세서를 사용합니다. 음수는 카운트 다운되는 것처럼 저장하는 것이 가장 좋으며 2의 보수는 1을 더한 것입니다. 숨겨진. 0은 양수로 간주되므로 음수는 0에 대한 값을 가질 수 없기 때문에 자동으로 -1 (비트 플립 이후 양수 1)이 추가됩니다. 음수를 해독 할 때이를 설명해야합니다.