unsigned int i = ~0;
결과는 : -1
i
및
signed int y = ~0;
결과에 할당 할 수있는
왜 -1
이 나옵니까? y
에 할당 할 수있는 최대 숫자를 가져야하지 않습니까?
unsigned int i = ~0;
결과는 : -1
i
및
signed int y = ~0;
결과에 할당 할 수있는
왜 -1
이 나옵니까? y
에 할당 할 수있는 최대 숫자를 가져야하지 않습니까?
모두 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
이됩니다.
~0
은 모든 비트가 1로 설정된 경우에만 int
입니다. unsigned
으로 해석하면 UINT_MAX
과 같습니다. signed
으로 해석하면 -1
이됩니다.
가정 32 비트의 int :
0 = 0x00000000 = 0 (signed) = 0 (unsigned)
~0 = 0xffffffff = -1 (signed) = UINT_MAX (unsigned)
고맙겠지 만 0xffffffff가 -1 인 이유는 무엇입니까? – user1365914
~ 0 = 0xffffffff = -1 (부호있는, -1의 2의 보수 형식). 모든 시스템이 이러한 접근 방식을 따르고 있습니까? – SparKot
할당은 재 해석이 아니라 값 변환 :'unsigned int'에 할당되었을 때'~ 0'은'int''' -'0''이'-1'을 나타내는 경우에만 UINT_MAX를 산출합니다 – Christoph
아니 ~
가 비트 NOT 연산자 입력 연산자 아닌 최대 값이기 때문이다. ~0
은 int
에 해당하며 모든 비트는 1
으로 설정되며 서명되지 않은 것으로 해석되는 최대 숫자는 부호없는 int로 해석되며 -1로 표시됩니다.
two's complement 기계에 있어야합니다.
바울의 대답은 절대적으로 옳다 :
은 더를 참조하십시오.
#include <limits.h>
signed int y = INT_MAX;
unsigned int x = UINT_MAX;
을 그리고 지금은 값을 확인하는 경우 : 대신 0 ~를 사용하여, 당신은 사용할 수있는 시스템에 당신이 최대 값을 볼 수 있습니다
printf("x = %u\ny = %d\n", UINT_MAX, INT_MAX);
.
unsigned int i = ~0;
결과 : 최대 수는 내가에 난 보통
, 그러나 반드시 할당 할 수 있습니다. ~0
이라는 표현식은 모든 (채워지지 않은) 비트가 설정된 int
으로 평가됩니다. C 표준은 부호있는 정수에 대한
~0 = -1
및 (-1) + (UINT_MAX + 1) = UINT_MAX
에 unsigned int
결과가 할당된다.~0
은 음수 0 또는 트랩 표현입니다. 그것은 unsigned int
을 그 않을 경우 1
이다 (UINT_MAX + 1) - INT_MAX
에 unsigned int
결과에 할당 부정적인 경우 ~0
이 INT_MIN == -INT_MAX
인 제로, 0unsigned int
결과에 할당하고, 만약 unsigned int
의 폭이 일반적인 경우에 int
및 2^(WIDTH - 1) + 1
보다 작은 폭 (부호없는 정수 유형의 값 비트 수, 부호있는 정수 유형의 경우 부호 비트의 수 +1)이 있습니다. 너비는 int
입니다.초기화
unsigned int i = ~0u;
는 항상 값 UINT_MAX
을 들고 i
가 발생합니다.
signed int y = ~0;
결과 : -1
위에서 언급 한 바와 같이, 부호있는 정수의 표현은 (현재까지 가장 일반적인 표현입니다) 2의 보수를 사용하는 경우에만.
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)이 추가됩니다. 음수를 해독 할 때이를 설명해야합니다.
~ 연산자가 무엇을하는지 알고 있습니까? –
음,'-1'은 정수에 넣을 수있는 최대 수입니다. 그러나 _maximum_는 절대 이진 값으로 정의됩니다. –