부호없는 변수에 음수 값을 할당하면 어떻게 될지 궁금했습니다.
코드는 다음과 같습니다.
unsigned int nVal = 0;
nVal = -5;
컴파일러 오류가 발생하지 않았습니다. 프로그램을 실행할 때 nVal
이상한 값이 할당되었습니다! 2의 보수 값이 할당되는 것일 수 nVal
있습니까?
부호없는 변수에 음수 값을 할당하면 어떻게 될지 궁금했습니다.
코드는 다음과 같습니다.
unsigned int nVal = 0;
nVal = -5;
컴파일러 오류가 발생하지 않았습니다. 프로그램을 실행할 때 nVal
이상한 값이 할당되었습니다! 2의 보수 값이 할당되는 것일 수 nVal
있습니까?
nVal = (unsigned int) -5;
. 의 캐스팅 -5
에이 unsigned int
되는 정의 6.3.1.3에서. 2s 보수의 표현은 표준에 의해 의무화되지 않지만 부호없는 것으로 변환하는 알고리즘은 다음과 같습니다. "값이 범위 내에있을 때까지 newtype에서 표현할 수있는 최대 값보다 하나 더 많은 값을 반복적으로 더하거나 빼서 값을 변환합니다. 새로운 유형의. "
답변:
공식 답변-섹션 4.7 conv.integral
대상 유형은 부호가 "결과 값은 소스 정수 최소 부호없는 정수 합치는 (모듈로 2 N
n
. 2의 보수 표현이 변환 [참고 인 부호 타입을 나타내는 데 사용되는 비트 수) 개념적이며 비트 패턴에 변화가 없습니다 (잘림이없는 경우).
이것은 본질적으로 기본 아키텍처가 2의 보수가 아닌 메서드 (예 : 부호있는 크기 또는 1의 보수)에 저장하는 경우 부호없는 변환이 2의 보수 인 것처럼 동작해야 함을 의미합니다.
unsigned int에 -5 (2의 보수)를 나타내는 비트 패턴을 할당합니다. 큰 부호없는 값이됩니다. 32 비트 정수의 경우 2 ^ 32-5 또는 4294967291입니다.
ceil(log_2(x))
) 위한 축약 형입니다 .)
최대 부호없는 정수-4 값의 양의 정수로 표시됩니다 (값은 컴퓨터 아키텍처 및 컴파일러에 따라 다름).
BTW
간단한 C ++ "hello world"유형 프로그램을 작성하여이를 확인하고 직접 확인할 수 있습니다.
맞습니다. 부호있는 정수는 2의 보수 형식으로 저장되고 부호없는 정수는 부호없는 이진 표현에 저장됩니다 . C (및 C ++)는 둘을 구분하지 않으므로 최종 값은 단순히 2의 보수 이진 표현의 부호없는 이진 값입니다.
네, 맞습니다. 할당 된 실제 값은 세 번째를 제외한 모든 비트 세트와 유사합니다. -1은 모든 비트 세트 (16 진수 : 0xFFFFFFFF), -2는 첫 번째 비트를 제외한 모든 비트입니다. 당신이 보게 될 것은 아마도 10 진수로 4294967291에 해당하는 16 진수 값 0xFFFFFFFB 일 것입니다.
부호없는 변수에 음수 값을 할당하면 2의 보수 방법을 사용하여 처리하고이 방법에서는 모든 0을 1로, 모든 1을 0으로 뒤집은 다음 1을 더합니다. 귀하의 경우에는 4 바이트 (32 비트) 인 int를 다루고 있으므로 32 비트 숫자에 2의 보수 방법을 사용하여 더 높은 비트를 뒤집습니다. 예를 들면 :
┌─[student@pc]─[~]
└──╼ $pcalc 0y00000000000000000000000000000101 # 5 in binary
5 0x5 0y101
┌─[student@pc]─[~]
└──╼ $pcalc 0y11111111111111111111111111111010 # flip all bits
4294967290 0xfffffffa 0y11111111111111111111111111111010
┌─[student@pc]─[~]
└──╼ $pcalc 0y11111111111111111111111111111010 + 1 # add 1 to that flipped binarry
4294967291 0xfffffffb 0y11111111111111111111111111111011