형식 지정자 % d 및 % u를 사용하여 ~ 0을 (unsigned int) 및 (unsigned short)로 캐스팅하면 short에 대해서는 동일한 결과가 생성되지만 int에 대해서는 다른 결과가 생성됩니다.

하 슬로 바르 도스

char, short, int 및 long 변수의 범위를 부호있는 및 부호없는 값으로 계산하는 과정에서 다음 솔루션의 도움을 받았습니다.

  1. https://stackoverflow.com/a/19085193/11320006

  2. http://www.learntosolveit.com/cprogramming/Ex_2.1_cal_limits.html

솔루션 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, 예제의 경우와 같이 모든 값을 나타낼 수있는 intif로 승격합니다 . 또는 유형의 인수 또는 더 넓은 정수 유형 에는 영향을주지 않습니다 .intunsigned shortunsigned intintunsigned int

제시된 코드의 핵심 문제는 ...

printf("Value of unsigned int is %d\n", (unsigned int)~0);

... %d지시문이 해당 인수와 올바르게 일치하지 않기 때문에 정의되지 않은 동작을 나타냅니다 . 서명%d 된에 일치해야 하지만 . 실제로 UB는 인수의 비트 패턴을 마치 서명되지 않은 비트 패턴이 아닌 것처럼 해석하는 것으로 나타납니다 . 그러나 원칙적으로 프로그램은 그 힘 내에서 모든 것을 할 수있었습니다. intunsigned intsigned int

유형 불일치로 인해 정의되지 않은 동작도 있습니다.

printf("Value short unsigned int is %u\n", (unsigned short)~0);

지시문 %hu은 해당하는 실제 인수와 가장 일치하지만 %d앞서 언급 한 자동 유형 승격으로 인해 허용됩니다. %u일치하지 않습니다 . 그러나이 경우 매니페스트 된 UB는 최소한 출력이 나타내는 한 예상 한 동작과 동일합니다. 실제로 음이 아닌 signed int인수 의 비트 패턴은 unsigned int.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관