Pergunta

Usando o scanf, cada número digitado, gostaria que meu programa imprimisse duas linhas: por exemplo

byte order: little-endian

> 2
     2 0x00000002
  2.00 0x40000000

> -2
    -2 0xFFFFFFFE
 -2.00 0xC0000000

Posso imprimir o 2 em hexadecim

Se eu for lançado como flutuação quando tento imprimir, recebo um zero. Se eu entrar em contato como um flutuador, recebo a saída correta. Eu tentei converter o int em um bóia, mas ele ainda sai como zero.

Aqui está minha saída até agora

Int - float - hex

byte order: little-endian

>2

         2  0x000002
      2.00  00000000

Parece que estou convertendo para um flutuador bem, por que não é imprimido como hexadecimal? Se eu entrar em contato como um bóia, recebo a representação hexadecimal correta como o primeiro exemplo. Isso deve ser algo simples. Eu preciso procurar como decimal ter em mente que estou executando isso em cygwin

Aqui está o que eu tenho até agora ..

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{


int HexNumber;
    float convert;
printf("Int - float - hex\n");



int a = 0x12345678;
unsigned char *c = (unsigned char*)(&a);
if (*c == 0x78)
{
    printf("\nbyte order: little-endian\n");
}
else
{
    printf("\nbyte order: big-endian\n");
}

printf("\n>");
scanf("%d", &HexNumber);
printf("\n%10d  ",HexNumber);
printf("%#08x",HexNumber);





convert =  (float)HexNumber; // converts but prints a zero

printf("\n%10.2f  ", convert); 
printf("%#08x", convert); // prints zeros


return 0;
}
Foi útil?

Solução

Experimente isso:

int i = 2;
float f = (float)i;
printf("%#08X", *( (int*) &f ));

EDITAR

@Corey:

Vamos analisar de dentro para fora:

&  f = address of f = say address 0x5ca1ab1e
(int*)  &f = interpret the address 0x5ca1ab1e as integer pointer
*  ((int*)&f) = get the integer at address 0x5ca1ab1e

A seguir, é mais conciso, mas é difícil lembrar a associatividade e a precedência do operador da linguagem C (prefiro a clareza extra de alguns parênteses adicionais e espaço em branco fornece):

printf("%#08X", *(int*)&f);

Outras dicas

printf("%#08x", convert); // prints zeros

Esta linha não vai funcionar porque você está dizendo printf que você está passando em um int (usando o %x) Mas de fato você está passando em um float.

Qual é a sua intenção com esta linha? Para mostrar a representação binária do número de ponto flutuante em hexadecimal? Nesse caso, você pode querer tentar algo assim:

printf("%lx\n", *(unsigned long *)(&convert));

O que esta linha está fazendo é pegar o endereço de converter (&convert) que é um ponteiro para flutuar e lançá -lo em um ponteiro para um longo tempo não assinado (note: que o tipo em que você lançou aqui pode ser diferente, dependendo do tamanho da flutuação e do seu sistema). O último * está desreferenciando o ponteiro de um não assinado por muito tempo em um tempo não assinado que é passado para printf

Dado um int x, convertendo para flutuar, imprimindo os bytes daquele flutuação em hexadecimal poderia ser feito algo assim:

show_as_float(int x) { 
   float xx = x;

   //Edit: note that this really prints the value as a double.
   printf("%f\t", xx);

   unsigned char *ptr = (unsigned char *)&xx;

   for (i=0; i<sizeof(float); i++)
       printf("%2.2x", ptr[i]);
}

Os padrões (C ++ e C99) fornecem "dispensação especial" para unsigned char, por isso é seguro usá -los para ver os bytes de qualquer objeto. C89/90 não garantiu isso, mas era razoavelmente portátil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top