char, short, int 및 long 변수의 범위를 부호있는 및 부호없는 값으로 계산하는 과정에서 다음 솔루션의 도움을 받았습니다.
솔루션 1에 따르면 (unsigned short)~0
아래 코드에서 -1 및 65535를 출력 할 것으로 예상 했습니다. 그 동작이 (unsigned int)~0
두 형식 지정자에 대한 코드 와 동일하다고 가정 합니다.
// the two statements below produce different results
printf("Value of unsigned int is %d\n", (unsigned int)~0); // outputs -1
printf("Value of unsigned int is %u\n", (unsigned int)~0); // outputs 4294967295
// whereas, the two statements below produce the same result. Why?
printf("Value of short unsigned int is %d\n", (unsigned short)~0); // outputs 65535, expected -1
printf("Value short unsigned int is %u\n", (unsigned short)~0); // outputs 65535
(unsigned short)~0
및 의 동작에 차이가있는 이유는 무엇 (unsigned int)~0
입니까?
(unsigned short)~0
및 의 동작에 차이가있는 이유는 무엇(unsigned int)~0
입니까?
이러한 표현의 동작은 유사합니다. type의 2의 보수 표현을 가정하면 int
각각은 (부호없는) 유형의 표현 가능한 가장 큰 값을 계산합니다.
그러나 가변 인수 printf
는 기본 인수 승격의 영향을받습니다. 이것은에 영향을 미치며 unsigned short
, 예제의 경우와 같이 모든 값을 나타낼 수있는 int
if로 승격합니다 . 또는 유형의 인수 또는 더 넓은 정수 유형 에는 영향을주지 않습니다 .int
unsigned short
unsigned int
int
unsigned int
제시된 코드의 핵심 문제는 ...
printf("Value of unsigned int is %d\n", (unsigned int)~0);
... %d
지시문이 해당 인수와 올바르게 일치하지 않기 때문에 정의되지 않은 동작을 나타냅니다 . 서명%d
된에 일치해야 하지만 . 실제로 UB는 인수의 비트 패턴을 마치 서명되지 않은 비트 패턴이 아닌 것처럼 해석하는 것으로 나타납니다 . 그러나 원칙적으로 프로그램은 그 힘 내에서 모든 것을 할 수있었습니다. int
unsigned int
signed
int
유형 불일치로 인해 정의되지 않은 동작도 있습니다.
printf("Value short unsigned int is %u\n", (unsigned short)~0);
지시문 %hu
은 해당하는 실제 인수와 가장 일치하지만 %d
앞서 언급 한 자동 유형 승격으로 인해 허용됩니다. %u
일치하지 않습니다 . 그러나이 경우 매니페스트 된 UB는 최소한 출력이 나타내는 한 예상 한 동작과 동일합니다. 실제로 음이 아닌 signed int
인수 의 비트 패턴은 unsigned int
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다