development

부호없는 변수에 음수 값을 할당하면 어떻게됩니까?

big-blog 2020. 10. 27. 22:50
반응형

부호없는 변수에 음수 값을 할당하면 어떻게됩니까?


부호없는 변수에 음수 값을 할당하면 어떻게되는지 궁금했습니다.

코드는 다음과 같습니다.

unsigned int nVal = 0;
nVal = -5;

컴파일러 오류가 발생하지 않았습니다. 프로그램을 실행할 때 nVal이상한 값이 할당되었습니다! 2의 보수 값이 할당되는 것일 수 nVal있습니까?


공식 답변-섹션 4.7 conv.integral

"대상 유형이 부호없는 경우 결과 값은 소스 정수에 합동하는 최소 부호없는 정수입니다 (모듈로 2 n 여기서는 n부호없는 유형을 나타내는 데 사용되는 비트 수). [참고 : 2의 보수 표현에서이 변환은 개념적이며 비트 패턴에 변화가 없습니다 (잘림이없는 경우).

이것은 본질적으로 기본 아키텍처가 2의 보수가 아닌 메서드 (예 : 부호있는 크기 또는 1의 보수)에 저장하는 경우 부호없는 변환이 2의 보수 인 것처럼 동작해야 함을 의미합니다.


unsigned int에 -5 (2의 보수)를 나타내는 비트 패턴을 할당합니다. 큰 부호없는 값이됩니다. 32 비트 정수의 경우 2 ^ 32-5 또는 4294967291입니다.


최대 부호없는 정수-4 값의 양의 정수로 표시됩니다 (값은 컴퓨터 아키텍처 및 컴파일러에 따라 다름).

BTW
간단한 C ++ "hello world"유형 프로그램을 작성하여이를 확인하고 직접 확인할 수 있습니다.


맞습니다. 부호있는 정수는 2의 보수 형식으로 저장되고 부호없는 정수는 부호없는 이진 표현에 저장됩니다 . C (및 C ++)는 둘을 구분하지 않으므로 최종 값은 단순히 2의 보수 이진 표현의 부호없는 이진 값입니다.


네, 맞습니다. 할당 된 실제 값은 세 번째를 제외한 모든 비트 세트와 유사합니다. -1은 모든 비트 세트 (16 진수 : 0xFFFFFFFF), -2는 첫 번째 비트를 제외한 모든 비트입니다. 당신이 보게 될 것은 아마도 10 진수로 4294967291에 해당하는 16 진수 값 0xFFFFFFFB 일 것입니다.

참고 URL : https://stackoverflow.com/questions/2711522/what-happens-if-i-assign-a-negative-value-to-an-unsigned-variable

반응형