cint로 uint8_t를 인쇄 할 수 없습니다 문제가 있습니다. 값을

C ++에서 정수로 작업하는 데 이상한 문제가 있습니다.

값을 변수로 설정하고 인쇄하는 간단한 프로그램을 작성했지만 예상대로 작동하지 않습니다.

내 프로그램에는 두 줄의 코드 만 있습니다.

uint8_t aa = 5;

cout << "value is " << aa << endl;

이 프로그램의 출력은 value is

즉,에 공백으로 인쇄됩니다 aa.

내가 변경하는 경우 uint8_tuint16_t위의 코드를 마치 마법처럼 작동합니다.

64 비트 Ubuntu 12.04 (Precise Pangolin)를 사용하며 컴파일러 버전은 다음과 같습니다.

gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)



답변

실제로 공백을 인쇄하지는 않지만 값이 5 인 ASCII 문자는 인쇄 할 수 없거나 보이지 않습니다. 보이지 않는 ASCII 문자 코드 가 여러 개 있는데 , 대부분이 실제로는 공백 인 값 32 미만입니다.

보이는 문자 값을 출력하려고하기 때문에 숫자 값을 출력하려면 로 변환 aa해야 합니다.unsigned intostream& operator<<(ostream&, unsigned char)

uint8_t aa=5;

cout << "value is " << unsigned(aa) << endl;


답변

uint8_ttypedef대한 가능성이 높습니다 unsigned char. 이 ostream클래스에는에 대한 특수 과부하가 있습니다 unsigned char. 즉 인쇄 할 수없는 숫자 5로 문자를 인쇄하므로 빈 공간이됩니다.


답변

기본 데이터 유형의 변수 앞에 단항 + 연산자를 추가하면 ASCII 문자 (문자 유형의 경우) 대신 인쇄 가능한 숫자 값이 제공됩니다.

uint8_t aa = 5;
cout<<"value is "<< +aa <<endl;


답변

출력 연산자는 ( 일반적으로에 대한 별칭 일뿐) uint8_t처럼 취급 하므로 ASCII 코드 (가장 일반적인 문자 인코딩 시스템)로 문자를 인쇄합니다 .charuint8_tunsigned char5

예를 들어이 참조를 참조하십시오 .


답변

  • 의 사용을 만들기 ADL (인수 종속적 이름 조회를)

    #include <cstdint>
    #include <iostream>
    #include <typeinfo>
    
    namespace numerical_chars {
    inline std::ostream &operator<<(std::ostream &os, char c) {
        return std::is_signed<char>::value ? os << static_cast<int>(c)
                                           : os << static_cast<unsigned int>(c);
    }
    
    inline std::ostream &operator<<(std::ostream &os, signed char c) {
        return os << static_cast<int>(c);
    }
    
    inline std::ostream &operator<<(std::ostream &os, unsigned char c) {
        return os << static_cast<unsigned int>(c);
    }
    }
    
    int main() {
        using namespace std;
    
        uint8_t i = 42;
    
        {
            cout << i << endl;
        }
    
        {
            using namespace numerical_chars;
            cout << i << endl;
        }
    }

    산출:

    *
    42
  • 커스텀 스트림 매니퓰레이터도 가능합니다.

  • 단항 더하기 연산자는 깔끔한 관용구입니다 ( cout << +i << endl).

답변

cout인쇄 할 수없는 문자 인 ASCII 값 aa으로 처리하고 있으므로 인쇄 하기 전에 형식 변환을 시도하십시오 .char5int


답변

operator<<()사이 과부하 istreamchar비 멤버 함수이다. 멤버 함수를 명시 적으로 사용하여 char(또는 a uint8_t)를로 취급 할 수 있습니다 int.

#include <iostream>
#include <cstddef>

int main()
{
   uint8_t aa=5;

   std::cout << "value is ";
   std::cout.operator<<(aa);
   std::cout << std::endl;

   return 0;
}

산출:

value is 5