부호없는 변수에 음수 값을 할당하면 어떻게됩니까?
부호없는 변수에 음수 값을 할당하면 어떻게되는지 궁금했습니다.
코드는 다음과 같습니다.
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 일 것입니다.
'development' 카테고리의 다른 글
사이드 키크 대기열 지우기 (0) | 2020.10.28 |
---|---|
클라이언트 측에서 HTML 삭제 / 재 작성 (0) | 2020.10.28 |
Android에서 콤보 박스를 표시하려면 어떻게해야합니까? (0) | 2020.10.27 |
파이썬에 불변 목록이 있습니까? (0) | 2020.10.27 |
C ++ 11 정규식은 파이썬보다 느립니다. (0) | 2020.10.27 |