바이트를 16진수로 인쇄할 때 printf의 예기치 않은 출력 이해
char 요소가 포함된 pixel_data와 같은 벡터 데이터 유형으로 작업할 때 일반적으로 다음이 발생합니다. 16진수 형식으로 단일 바이트를 인쇄하려고 하면 예상치 못한 결과가 발생합니다. 특히 printf(" 0x%1x ", pixel_data[0] )를 사용하여 pixel_data[0]를 인쇄하면 예상되는 0xf5 대신 0xfffffff5가 생성될 수 있습니다.
이 동작은 printf의 특성에서 발생합니다. 여기서 %x 수정자는 부호 없는 정수를 인수로 예상합니다. 결과적으로 varargs 함수에 제공될 때 일반적으로 정수로 승격되는 char 값은 printf에서 int로 처리됩니다.
신뢰할 수 있는 결과를 얻으려면 unsigned int로 명시적으로 캐스팅하는 것이 좋습니다. :
printf(" 0x%1x ", (unsigned)pixel_data[0] );
또한 필드 너비 1은 표시할 최소 자릿수와 최소 한 자릿수를 지정하므로 이상적이지 않을 수 있습니다. 항상 사용됩니다.
시스템의 char이 부호 있는 유형으로 처리되는 경우 변환으로 인해 음수 char 값에 대해 큰 부호 없는 int 값(예: fffffff5)이 생성될 수 있습니다. 바이트 값이 부호 없는 것으로 처리되도록 하려면 pixel_data에 부호 없는 char을 사용하거나, 부호 없는 char를 통해 캐스팅하거나, 마스킹 작업을 사용하세요.
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] ); printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
위 내용은 바이트를 인쇄할 때 `printf`가 예기치 않은 16진수 출력을 표시하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!