2012-03-07 19 views
12

Sé que podemos usar printf ("% 04X", valor); para imprimir valores hexadecimales sin signocómo imprimir el hex firmado en c

¿existe una marca o función similar en c que pueda usar para imprimir valores hexadecimales firmados?

algo similar como esto

BINARY HEX(SIGNED) HEX (UNSIGNED) 
-------- ----------- -------------- 

00000010 +0x2  0x2 
00000001 +0x1  0x1 
00000000 +0x0  0x0 
11111111 -0x1  0xFF 
11111110 -0x2  0xFE 
11111101 -0x3  0xFD 

Respuesta

0

¿Qué quiere decir por un valor hexadecimal "firmado"? ¿Deseas algo como "-e0"? Si es así, ¿qué significa eso? El signo ya está representado en la pantalla hexadecimal, ya que muestra todos los bits y esa es toda la información que está en el número.

+1

Bueno, se puede interpretar como el valor en hexadecimal con signo delante de él. Si uno puede quererlo por una razón válida es otro problema :) –

+0

ver mi edición anterior – David

3

No, pero se puede hacer algo como

printf("%c%04X",(x<0)?'-':' ',(x<0)?-x:x); 

Pero, como otro punto a cabo, es dudoso que exista una razón válida para hacerlo. Asegúrese de entender exactamente qué es lo que está pidiendo.

EDITAR: de acuerdo con la edición de su mensaje, te entiendo lo que estás pidiendo, por lo que es todo culpa tuya ;-)

+0

Si no le gustan los errores y la ofuscación, simplemente puede hacer 'if (x <0) printf (" - ")' antes de imprimir el número. Porque tienes dos posibles errores en tu código. – Lundin

+0

Primer error posible: '(x <0)? '-': ''' pasa una int a printf, no una char como se esperaba. Esto se debe a que el segundo y tercer operando del operador?: Están equilibrados. Ambos operandos están por lo tanto sujetos a promociones enteras implícitas. Esto es especialmente malo en C++, donde los literales de caracteres son de tipo char, y no int como en C. – Lundin

+0

Segundo posible error: '(x <0)? - x: x' Si x está firmado, el código no hace sentido de usar unario - operador, porque x ya estaría en el formato deseado. Si x no está firmado, aún no tiene sentido utilizar unario -, ya que el resultado es un tipo sin signo. E incluso si lograra obtener el 2do operando de?: A un tipo con signo, aún estaría equilibrado de nuevo a un tipo sin signo, debido al 3er operando. – Lundin

7

Desafortunadamente función de C printf no tiene manera de hacerlo directamente. Se podría, por supuesto, en lugar de tratar:

printf("%s%x\n", x<0?"-":"", x<0?-(unsigned)x:x); 

Editar: Creo que ha solucionado el problema de manejar INT_MIN ...

+1

wuahhh, ahora que es un hack feo ... ¿No hay nada más, ni siquiera en C99? si no: Maldito seas, C. – Gewure