Evdokimov |
Отправлено: 22.02.2006, 02:12 |
|
Не зарегистрирован
|
Может кто подскажет. Нужно как-то вытащить число в плавающем формате в том виде, в каком оно хранится в машине, его внутренне представление. Все байты в шестнадцатиричном виде. |
|
BadMan |
Отправлено: 22.02.2006, 09:20 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 37
|
float a;
unsigned char *Buff;
Buff = (char*) &a;
Дальше по адресу Buff хранится цепочка байтов длинной sizeof(float).
Вместо или unsigned char можно взять тип byte.
А по поводу шестнадцатеричного вида — это как душе угодна, машина умеет хранить только в двоичном виде, восьмеричный, шестнадцетеричный — это уже по надобности — отображай как хочешь. |
|
AVC |
Отправлено: 22.02.2006, 09:23 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
Нужно как-то вытащить число в плавающем формате в том виде, в каком оно хранится в машине
|
Если делать на С — почитать учебники по языку
или переформулировать более грамотно вопрос.
|
|
John |
Отправлено: 22.02.2006, 10:05 |
|
Не зарегистрирован
|
Можно вот так верно работает проверяй:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float *point;
float a=3.5;//любое число можно вставить
AnsiString S;
unsigned char buf_float[4];
point=&a;
memcpy(buf_float,point,4);//функция работает с областью памяти
for (int i=0;i<4;i++)
{
S.printf("%X",buf_float[i]);
Edit1->Text=Edit1->Text+"0x"+S+" ";
}
} |
|
avc* |
Отправлено: 22.02.2006, 10:33 |
|
Не зарегистрирован
|
Нельзя полагаться на то, что float ВСЕГДА 4 байта — лучше использовать sizeof(float)
Незачем гонять байты из памяти в память, лучше использовать указатель как это сделано у BadMan
В вопросе не было "как показать в компоненте", может автор имел ввиду что-то своё.
Формально — ответом на вопрос может быть код float a = 3.14. Здесь константа 3.14 "вытаскивается" в переменную a именно "в том виде, в каком оно хранится в машине, его внутренне представление". |
|
John |
Отправлено: 22.02.2006, 11:07 |
|
Не зарегистрирован
|
Я предложил как один из вариантов ничег более.
А как понятнее будет Evdokimov ему решать. Если учесть все замечания то получится так:
float a=3.5;
unsigned char buf_float[sizeof(float)];
memcpy(buf_float,&a,sizeof(float));
|
|
Grigoriy |
Отправлено: 22.02.2006, 12:48 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
Подождите, я отвечу сегодня.
Я не могу сейчас ответить. У меня дома нет сетевого подключения. Пишет сетевой кабель не подключен. И у всег моих сосетян тоже самое.
Пишу из клуба, что у меня "под комнатой" на низу.
Пойду к себе домой. Напишу код. Приду с дискетой и скопирую.
|
|
viva |
Отправлено: 22.02.2006, 13:03 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 31
|
Вопрос Evdokimova очень странен.
Может он просит структуру IEEE и как раскрыть её из последовательности байтов? |
|
Konstantine |
Отправлено: 22.02.2006, 15:00 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
CODE |
union {float ft;
char ch[4];} fl_ch;
fl_ch.ft=3.14;
fl_ch.ch[i]; // байты... |
Отредактировано Konstantine — 22/02/2006, 15:04
|
|
Grigoriy |
Отправлено: 22.02.2006, 19:04 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
QUOTE | Если делать на С — почитать учебники по языку
или переформулировать более грамотно вопрос. |
Или предоставить полную информацию по машинному представлению числа с плавающей точкой в этом форуме.
Читайте присоединенное изображение.
В общем выведенный мною код следующий...
CODE |
AnsiString floattohexadecimalshow(long double ld, unsigned char* v,int kolb)
{
/*Функция возвращает строку с шестнадцатеричным представлением числа с плавающей точкой в нужной точности (4, 8 или 10 байтов)*/
AnsiString ret1;
void* p;
ret1.SetLength(kolb*2);
p=ret1.c_str();
asm{
//fninit;
/*Подзадача 1
сохранение числа в нужной точности результата
точность — количество байтов — хранится в переменной kolb
(4, 8, 10)*/
mov edi,p;
mov esi,v;
mov ecx,kolb;
fld tbyte ptr ld;
cmp ecx,8;
jbe @1;
fstp tbyte ptr [esi];
jmp @7;
@1:cmp ecx,4;
jz @2;
fstp qword ptr [esi];
jmp @7;
@2:fstp dword ptr [esi];
@7:
/*Подзадача 2
Перевод последовательности байтов в шестнадцатеричное представление*/
cld;
@c1:lodsb;
mov dl,al;
mov bl,al;
and bl,15;
shr dl,4;
and dl,15;
mov al,'0';
add al,dl;
cmp dl,10;
jb @3;
add al,7;
@3:
stosb;
mov al,'0';
add al,bl;
cmp bl,10;
jb @4;
add al,7;
@4:
stosb;
loop @c1;
};
return ret1;
};
|
Пример...
CODE |
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString rre;
unsigned char v1[10];
rre=floattohexadecimalshow(1.7,v1,8);
Edit1->Text=rre;
}
|
И читаем...
Присоединить изображение
|
|
Guest |
Отправлено: 23.02.2006, 00:15 |
|
Не зарегистрирован
|
Спасибо всем. Неожиданно, так много ответов и даже учебник не поленились отсканировать. Учебник я читал. Пробовал самый первый вариант, но не с char, а с int. Не работал. Иду пробовать то, что было предложенно. |
|