Как создать строку NSSt в формате HxHHHHHHHH, представляющую значение с плавающей запятой в Objective C, C ++ или C? - PullRequest
0 голосов
/ 20 июля 2011

Предположим, у нас есть

float x = 24.0;

Я хочу сделать следующее:

// hexRepresentation is of format HxHHHHHHHH 
// where H is a hexadecimal symbol 0-9 or a-f
NSString *hexRepresentation = [self hexadecimalFromFloat:x];

Пожалуйста, помогите мне выполнить следующий метод:

- (NSString *)hexadecimalFromFloat:(float)flt {
    NSString *h;
    /*
        What should I do here to convert the float
        value into its HxHHHHHHHH format? Then what
        should I do to ensure it's converted into a
        proper NSString and assigned to h?
     */
    return h;
}

Ответы [ 2 ]

3 голосов
/ 20 июля 2011

Вы можете получить машинные данные с плавающей точкой, используя объединение или приведение указателя и разыменование.Объединение используется, когда несколько типов могут храниться в одном месте, и к любому из этих типов можно получить доступ независимо от того, какой из них использовался для установки значения.

union {
    float f;
    unsigned int i;
} converter;
converter.f = flt;
// converter.i now contains an integer representing the hexadecimal value of flt
h = [NSString stringWithFormat:@"0x%08X",converter.i];

Если вы получили указатель на число с плавающей точкойзатем приведите его к целому числу, вы получите тот же эффект.Этот метод требует меньше кода, но может быть более запутанным, когда вы его видите.

h = [NSString stringWithFormat:@"0x%08X",*((unsigned int *)(&flt))];

Точно так же, как ответ Янна, результатом является представление float машиной, и этот код предполагает, что float и int обаДлина 4 байта.

1 голос
/ 20 июля 2011

Грубый, непроверенный код:

unsigned int *fp = (unsigned int*)&flt;
h = [NSString stringWithFormat:@"0x%08X", *fp];

Это может быть или не быть в нотации IEEE-754 и т. Д. И т. Д. Также предполагается, что sizeof(float) == sizeof(int) == 4

...