uint8_t no se puede imprimir con cout

7 minutos de lectura

uint8 t no se puede imprimir con cout
CoderInNetwork

Tengo un problema extraño al trabajar con números enteros en C++.

Escribí un programa simple que establece un valor para una variable y luego lo imprime, pero no funciona como se esperaba.

Mi programa tiene solo dos líneas de código:

uint8_t aa = 5;

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

La salida de este programa es value is

Es decir, se imprime en blanco para aa.

cuando cambio uint8_t para uint16_t el código anterior funciona a las mil maravillas.

Uso Ubuntu 12.04 (Precise Pangolin), de 64 bits, y la versión de mi compilador es:

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

  • Posible duplicado del comportamiento de uint8_t iostream

    – phuclv

    30 de abril de 2017 a las 11:42

  • cout no imprime caracteres sin firmar

    – phuclv

    3 sep 2018 a las 10:05

uint8 t no se puede imprimir con cout
πάντα ῥεῖ

Realmente no imprime un espacio en blanco, pero probablemente el carácter ASCII con valor 5, que no se puede imprimir (o es invisible). Hay un número de códigos de caracteres ASCII invisiblesla mayoría de ellos por debajo del valor 32, que en realidad es el espacio en blanco.

tienes que convertir aa para unsigned int para generar el valor numérico, ya que ostream& operator<<(ostream&, unsigned char) intenta generar el valor del carácter visible.

uint8_t aa=5;

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

  • Dado que los moldes de estilo C están mal vistos, ¿no sería mejor hacer un static_cast?

    – Tim Séguine

    24 de octubre de 2013 a las 12:09

  • Debería ser convertido para int. Un yeso es una forma de hacerlo, pero no la única. +aa también funciona

    – Pete Becker

    24 de octubre de 2013 a las 14:07

  • ¿No es int(var) e (int)var realmente lo mismo?

    – Paula

    17 de febrero de 2014 a las 23:18

  • Ver la pregunta vinculada usando type(var) es lo mismo que (type)var es el mismo como el elenco de C: pruébelo con const, etc., ¡lo elimina!

    – Paula

    17 de febrero de 2014 a las 23:27

  • La respuesta “No. Se desaconsejan las conversiones de estilo c para c ++ por varias razones”. a “¿no es int(var) e (int)var realmente lo mismo?” Seguro que parece como si no te hubieras dado cuenta int(var) y (int)var tienen exactamente el mismo significado. int(var) se desaconseja precisamente en aquellos casos en los que (int)var es, exactamente por las mismas razones, porque significa exactamente lo mismo. (Sin embargo, puedo entender por qué lo harías aquí de todos modos, así que no estoy diciendo que necesites usar static_cast. Solo creo que el rastro de comentarios aquí se volvió un poco innecesariamente confuso).

    usuario743382

    25 de febrero de 2015 a las 16:01

1647577927 171 uint8 t no se puede imprimir con cout
arne

uint8_t lo más probable es que sea un typedef por unsigned char. los ostream La clase tiene una sobrecarga especial para unsigned chares decir, imprime el carácter con el número 5, que no es imprimible, de ahí el espacio vacío.

  • Desearía que el estándar realmente tratara a std::uint8_t como un tipo separado y no solo como una maldita definición de tipo. No hay una razón sensata para aplicar la semántica de caracteres a estos tipos cuando se usan junto con objetos de flujo.

    – antred

    31 de julio de 2015 a las 14:19

1647577928 118 uint8 t no se puede imprimir con cout
SridharKritha

Agregar un operador unario + antes de la variable de cualquier tipo de datos primitivo dará un valor numérico imprimible en lugar de un carácter ASCII (en el caso del tipo char).

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

  • Eso está bien, pero ¿por qué C++ no trata uint8_t como unsigned char ¿Cuáles serían los valores numéricos?

    – R1S8K

    25 mayo 2019 a las 21:35

  • @R1S8K esto se debe a que mientras uint8_t es solo un tipo de definición de unsigned char, unsigned char mismo es manejado por ostream al igual que char e imprime su valor ASCII.

    – Duro

    16 de mayo de 2020 a las 8:55

  • @Harsh ¡Gracias, hombre! por lo que es un tipo de definición de unsigned char eso explica mucho. Entonces el único entero es intCorrecto ?

    – R1S8K

    17 mayo 2020 a las 15:03

  • @R1S8K Bueno, el tipo de entero más pequeño sería short int que ocupa 2 bytes. También hay algunas otras variaciones del tipo entero.

    – Duro

    17 mayo 2020 a las 17:09


  • @Harsh También creo que cuando programo y declaro variables, no importa si declaro una variable que trataría solo con números pequeños que no excedan los 250 con un tamaño de registro grande como long o int porque el compilador optimizaría el uso de RAM o flash según lo que llene ese registro, ¿verdad?

    – R1S8K

    19 de mayo de 2020 a las 8:58

uint8 t no se puede imprimir con cout
pepper_chico

  • Haciendo uso de AVD (búsqueda de nombre dependiente del argumento):

    #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;
        }
    }
    

    producción:

    *
    42
    
  • También sería posible un manipulador de flujo personalizado.

  • El operador unario más también es un buen modismo (cout << +i << endl).

Es porque el operador de salida trata el uint8_t como un char (uint8_t suele ser solo un alias para unsigned char), por lo que imprime el carácter con el código ASCII (que es el sistema de codificación de caracteres más común) 5.

Ver por ejemplo esta referencia.

  • ¿Por qué? el compilador de C lo trata como un número. Creo que C++ es diferente en este punto.

    – R1S8K

    25 mayo 2019 a las 21:36

  • @PerchEagle Si lee la referencia vinculada, verá que el operador está sobrecargado para ambos signed y unsigned personajes (más allá del simple char que en C++ es realmente un tercer tipo separado). Así que si uint8_t es un alias para unsigned char (muy probablemente) eso es lo que se usará.

    – Un tipo programador

    25 mayo 2019 a las 22:05


  • ¿Podría verificar mi respuesta en este hilo y decirme si mi respuesta es correcta o no? stackoverflow.com/questions/15585267/…, mi respuesta es anterior a la última. Muchas gracias.

    – R1S8K

    26 mayo 2019 a las 12:00


1647577928 682 uint8 t no se puede imprimir con cout
No te preocupes niño

cout está tratando aa como char de valor ASCII 5 que es un carácter no imprimible, intente encasillar a int antes de imprimir

  • ¿Por qué? el compilador de C lo trata como un número. Creo que C++ es diferente en este punto.

    – R1S8K

    25 mayo 2019 a las 21:36

  • @PerchEagle Si lee la referencia vinculada, verá que el operador está sobrecargado para ambos signed y unsigned personajes (más allá del simple char que en C++ es realmente un tercer tipo separado). Así que si uint8_t es un alias para unsigned char (muy probablemente) eso es lo que se usará.

    – Un tipo programador

    25 mayo 2019 a las 22:05


  • ¿Podría verificar mi respuesta en este hilo y decirme si mi respuesta es correcta o no? stackoverflow.com/questions/15585267/…, mi respuesta es anterior a la última. Muchas gracias.

    – R1S8K

    26 mayo 2019 a las 12:00


los operator<<() sobrecarga entre std::ostream y char es una función no miembro. Puede usar explícitamente la función miembro para tratar un char (o un uint8_t) como un 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;
}

Producción:

value is 5

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad