c++ - hexadecimales - Cout no imprime número
int hexadecimal c++ (3)
Problema
No obtengo resultados de un cout simple, mientras que un printf siempre imprimirá el número:
std::cout << variableuint8; // prints nothing
printf("%u", variableuint8); // prints the number
Nunca me he encontrado con este comportamiento antes, y aunque tengo un trabajo alrededor, me gustaría entenderlo.
Contexto:
Yay, punteros. Por lo tanto, puede ser un poco más complicado que lo indicado. Aquí está el contexto: no creo que deba importar, para el momento en que cout y printf obtengan la información, se hace referencia a un simple personaje sin firma. Probablemente sea más información de la necesaria para resolver el problema, pero quería estar completa en caso de que fuera relevante.
typedef unsigned char UInt8;
typedef unsigned short UInt16;
typedef struct{
UInt8 len;
// some other definitions. sizeof(DeviceNotification) <= 8
}DeviceNotification;
UInt8 somerandomdata[8];
DeviceNotification * notification;
notification = (DeviceNotification *) somerandomdata;
std::cout << "Len: (" << notification->len << ")/n";
printf("Len: (%u)/n", notification->len);
Los datos aleatorios se inicializan en otro lugar. Para esta salida, el primer byte en la matriz es 0x08:
Salida:
Len: ()
Len: (8)
Ambiente
- Máquina de desarrollo:
- OS X 10.6.8
- Compilador LLVM 1.7
- Xcode 3.2.6
- Máquina de prueba:
- OS X 10.6.8
¿Ha intentado convertirlo en int, para evitar dependiendo del tipo de carácter que utiliza la implementación:
std::cout << (int)variableuint8;
Aquí hay una explicación de lo que está pasando: ¿Qué es un personaje sin firma?
Para tener una idea, su implementación está usando caracteres unsigned char
como caracteres. El código ASCII para 0x08 es el carácter de control de retroceso y, por supuesto, no es un carácter imprimible, es por eso que no ve una salida en el caso de std::cout
.
Está imprimiendo el personaje como un personaje.
#include <iostream>
int main() {
unsigned char c = 0x41;
std::cout << c << std::endl;
return 0;
}
Esto imprime ''A'' al stdout.
Aunque en ese caso, su código debería imprimir Len: (*)
, y yo verifiqué que imprime Len: (*)
.
Edición: como en las codificaciones de caracteres como ASCII o UTF-8 es probable que su consola esté usando, el carácter correspondiente a 8 (Retroceso) no es visible, parecerá que no está impreso.
(En algunos casos puede hacer que el carácter anterior (el (
) desaparezca porque es un carácter de retroceso. En DOS puede mostrar ◘)
Would std::cout << "Len: (" << (unsigned short)notification->len << ")/n";
imprimir el valor correcto? Supongo que lanzar a un número entero es lo que podría estar buscando.