2013-07-15 6 views
3

Как мы можем напечатать кодировку значения с плавающей запятой в C? Я знаю, что могу использовать %A, но это не тот формат, который я хочу.Как отобразить кодировку значения с плавающей запятой

Например, если мое значение равно 1.3416407, я хочу напечатать «0x3FABBAE2», я не «0X1.5775C4P + 0».

+2

Я приветствую вас, желая '0x' как префикс и верхний регистр A-F для шестнадцатеричных цифр. Имейте в виду, что стандарт не делает это легко; вы должны явно форматировать формат (например, «0x% .8X»). Если вы используете '% X', вы получаете 0X в качестве префикса, но A-F для цифр; если вы используете '% x', вы получаете 0x в качестве префикса, но a-f для цифр. –

ответ

4

Вы можете использовать соединение, например.

#include <stdio.h> 
#include <stdint.h> 

union { 
    float f; 
    uint32_t i; 
} u; 

u.f = 1.3416407f; 
printf("%#X\n", u.i); 
+1

СПАСИБО! Я НЕ МОЖЕТ НАЙТИ ЭТО ВЕЗДЕ! – Veridian

+0

не важно, но я думаю, что максимальное число цифр в плавающей запятой - '6'. +1 для использования 32-битного целого вместо 'int' – tay10r

+1

@ Тейлор Флорес, 6, вероятно, из FLT_DIG« число десятичных цифр, q, так что любое число с плавающей запятой с q десятичными цифрами может быть округлено в плавающее число, номер точки с цифрами p radix b и обратно без изменения до десятизначных цифр ". Так что, если вы совершаете круговое отключение, 6 в порядке. Если вам нужно «максимальное количество цифр», ему требуется более точное определение. Вам нужно будет сделать «% .7e» для printf(), все плавает отчетливо. – chux

1

Вы можете ходить типа октета по октету:

float f = 1.3416407; 
unsigned char *fp = (void *)&f; 
size_t i; 
printf("0x"); 
for (i = 0; i < sizeof(float); ++i) { 
    printf("%02X", fp[i]); 
} 
puts(""); 

Вам может понадобиться для печати октета в обратном порядке, в зависимости от желаемого порядка байт.

+1

Буду признателен за понижение, спасибо! – jxh

+0

Не мое голосование, но, возможно, обозначение 'i [(uint8_t *) & fl]' является фактором. –

+0

Хммм, похоже, сбой из-за [сглаживания] (https://stackoverflow.com/q/98650/2410359). – chux

2

Идея союза присутствует на @Paul R хорошо, но было бы полезно с уточнениями

union { 
    float f; 
    uint32_t i; 
} u; 

u.f = 1.3416407f; 
printf("0x%08" PRIX32 "\n", u.i); 

Это обеспечивает 8 шестнадцатеричных символов печатаются, заполнение нулями при необходимости. Он также соответствует sizeof (u.i), если он отличается от sizeof (int).

Хотя он страдает от необычного sizeof (float)! = Sizeof (uint32_t);

1

Чтобы распечатать шестнадцатеричное представление произвольной вещи, используйте

union { 
    arbitrary object; 
    unsigned char bytes[sizeof (arbitrary)]; 
} u; 

Т.е.

union { 
    float object; 
    unsigned char bytes[sizeof (float)]; 
} u; 

u.object = 1.3416407f; 
printf("0x"); 
for (size_t i = 0; i < sizeof(u.bytes); i++) { 
    printf("%02hhx", u.bytes[i]); 
} 
printf("\n"); 

Или поменять местами байты для небольшой Endian:

printf("0x"); 
for (size_t i = sizeof(u.bytes) - 1; i < sizeof(u.bytes); i--) { 
    printf("%02hhx", u.bytes[i]); 
} 
printf("\n"); 

Код выше предполагает, что CHAR_BIT == 8.

+0

@chux хорошая точка: D Я смотрел на выход, и поскольку он выглядел нормально, я не заметил, что я не указал ширину. –

+1

Для педантичного: что-то вроде 'printf («% 0 * hhx », (CHAR_BIT + 3)/4, u.bytes [i]);' Все еще этот ответ достаточно хорош, поскольку 'CHAR_BIT == 8' _very_ common. – chux

Смежные вопросы