Преобразование числа с плавающей точкой в ​​32-разрядный шестнадцатеричный C ++ - PullRequest
5 голосов
/ 30 августа 2011

Может ли кто-нибудь сказать мне, если есть какой-либо код для преобразования числа с плавающей запятой в шестнадцатеричный формат?

Например: float num = 70.482 и шестнадцатеричная функция должна возвращать 428CF6C9.

Если какие-либо коды уже были сделаны по этому вопросу, пожалуйста, напишите мне.

Приветствие.

Ответы [ 6 ]

16 голосов
/ 30 августа 2011

Вы можете просто написать это самостоятельно:

float x;
const unsigned char * pf = reinterpret_cast<const unsigned char*>(&x);

for (size_t i = 0; i != sizeof(float); ++i)
{
  // ith byte is pf[i]
  // e.g. printf("0x02X ", pf[i]);
}

Фактически, вы можете сделать это, чтобы получить двоичное представление любой (стандартная схема *) переменной.

*) спасибо, @R. Мартиньо Фернандес!

Если вы решите попробовать это на long double (или, точнее, на 80-битном плавающем преобразовании с повышенной точностью), знайте, что он имеет только 10 байтов, но дополняется до 12 или 16 на x86 / x64, соответственно.

3 голосов
/ 31 августа 2011

что-то вроде этого - преобразование floattohex, которое я использую .. (он также выполняет обмен битами, если вам это не нужно, извлеките его)

CString Class::FloatToHex(float* yourfloat)
{
unsigned char ch[4];
Cstring output;

memcpy(ch,yourfloat,sizeof(float));
output.Format("%X%X%X%X",ch[3],ch[2],ch[1],ch[0]);

return output;
}
2 голосов
/ 30 августа 2011

Рассмотрим:

union float_bits {
    unsigned int i;
    float f;
} bits;

Назначьте число с плавающей запятой в bits.f, затем интерпретируйте все число как целое число без знака и прочитайте его с помощью bits.i.При этом байты представления с плавающей точкой останутся нетронутыми, и не будет выполнено неявное преобразование типа, как это было бы при назначении числа с плавающей запятой переменной типа int.В этом случае мы предполагаем, что размер целого числа совпадает с размером числа с плавающей точкой.

Или вы можете сделать:

float f;
char *c = (char *) &f;

И затем получить доступ к отдельным байтам от f до c[index].

1 голос
/ 14 ноября 2011

вы можете использовать union:

union FloatToChar {
    float f;
    char  c[sizeof(float)];
};

FloatToChar x;
x.f = 10.42f;
for (size_t i=0; i<sizeof(float); i++)
    printf( "%X", x.c[i] );

вы можете сделать это и наоборот.

1 голос
/ 30 августа 2011
float f = 70.482f;
int i = *(reinterpret_cast<int*>(&f));
printf("%08x\n", i);
0 голосов
/ 30 августа 2011

Просто используйте sprintf (): http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

Например,

char out[8];
float myFloat = 70.482;
sprintf(out,"%X",myFloat);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...