>백엔드 개발 >C++ >Char 벡터에서 16진수 바이트를 인쇄할 때 `printf`가 예기치 않은 출력을 표시하는 이유는 무엇입니까?

Char 벡터에서 16진수 바이트를 인쇄할 때 `printf`가 예기치 않은 출력을 표시하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-07 07:04:111012검색

Why Does `printf` Show Unexpected Output When Printing Hexadecimal Bytes from a Char Vector?

16진수 바이트를 인쇄할 때 printf에서 예기치 않은 출력

문자 벡터(pixel_data)로 작업할 때 단일 바이트를 16진수 값으로 인쇄(printf(" 0x) %1x ", pixel_data[0]))이 예기치 않게 4바이트 정수를 생성할 수 있습니다. 의도한 값(0xf5) 대신 (0xfffffff5).

문제 원인

Printf는 일반적으로 %x 수정자에 대해 부호 없는 정수 매개변수를 예상합니다. 그러나 char은 printf와 같은 varargs 함수에 전달되면 int로 승격됩니다. 이 프로모션으로 인해 추가 바이트가 인쇄됩니다.

문제 해결

예측 가능한 결과를 보장하려면 문자를 부호 없는 정수로 명시적으로 캐스트하세요.

printf(" 0x%1x ", (unsigned)pixel_data[0]);

다음에 대한 고려 사항 변수 유형

  • 픽셀_데이터를 부호 없는 문자로 정의하여 바이트를 다음과 같이 처리합니다. 부호 없는 값.
  • 또는 printf 문 내에서 unsigned char로 변환합니다.
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0]);
  • unsigned int로 변환할 때 0 확장을 위해 마스킹 작업을 사용합니다.
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU);

분야의 이해 너비

%1x 필드 너비는 표시할 최소 자릿수를 지정합니다. 그러나 항상 최소한 한 자리 숫자가 필요하므로 이 맥락에서는 유용성이 제한됩니다.

위 내용은 Char 벡터에서 16진수 바이트를 인쇄할 때 `printf`가 예기치 않은 출력을 표시하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.