Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
BeginerMan
49 / 48 / 14
Регистрация: 17.11.2012
Сообщений: 427
#1

Как сохранить float в переменной типа char? - C++

01.05.2016, 20:43. Просмотров 1804. Ответов 76
Метки нет (Все метки)

Всем здрасьте.
Как можно записать float в char ?
http://www.cyberforum.ru/cpp-beginners/thread2019842.html
И как потом float вытащить из char, если он будет находится примерно посередине ну или в начале?

C++
1
2
3
4
5
6
7
8
float x;
char str[100]
// Запих x в str
//...
// Вытащить float ?
str[0-40] = // ... 
str[41] = //  если я знаю, что float начинается с 41 символа, к примеру
str[45-99] = //....
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2016, 20:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как сохранить float в переменной типа char? (C++):

Переменной d присвоить первую цифру после запятой некоторой переменной x типа float
Нужно целой переменной d присвоить первую цыфру после комы некоторой переменной...

Как работать с переменной типа char?
Не понимаю переменную char и как с ней работать.

Как получить адрес переменной типа unsigned char?
Всем привет! Как получить адрес переменной типа unsigned char? Всё ерунда...

Преобразование типа char в тип float
При считывании из файла чисел (каждое число расположено на новой строке, целая...

Работа с битами: как просмотреть и изменить заданный бит в переменной типа char?
Есть переменная типа char, как посмотреть в нем биты и изменять их?

76
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
01.05.2016, 20:48 #2
Преобразовать число в строку и обратно или просто записать байты?
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
01.05.2016, 20:50 #3
C++
1
2
float x = 12.34;
char *p = (char *)&x;//теперь мы можем обращаться к байтам float по отдельности
3
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3295 / 448
Регистрация: 04.12.2011
Сообщений: 9,114
Записей в блоге: 5
01.05.2016, 21:02 #4
Цитата Сообщение от BeginerMan Посмотреть сообщение
Как можно записать float в char ?
Никак. Размер float больше размера char даже в самых экзотических реализациях. То есть, в решающий момент char треснет пополам.
0
lbtrtb
0 / 0 / 1
Регистрация: 01.05.2016
Сообщений: 2
01.05.2016, 21:13 #5
Лучший ответ Сообщение было отмечено BeginerMan как решение

Решение

BeginerMan, можно так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
int main()
{
    float   x = 3.14f;
    float   y = 0.0f;
    char    str[100] = "";
 
    // Записать x в str
    // float начинается с 41 символа
    memcpy(&str[41], &x, sizeof(float));
 
    // Вытащить float
    memcpy(&y, &str[41], sizeof(float));
    std::cout << "y = " << y << std::endl;
 
    system("pause");
    return 0;
}
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3295 / 448
Регистрация: 04.12.2011
Сообщений: 9,114
Записей в блоге: 5
01.05.2016, 21:31 #6
В массив char можно. Вот вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <sstream>
#include <sstream>
#include <cmath>
using namespace std;
template<class T>
char *decimal_to_string(T number)
{
stringstream ss (stringstream::in | stringstream::out);
ss << number;
string str = ss.str();
char *pc=new char[str.length()+1];
strcpy(pc, str.c_str());
return pc;
}
 
/* если шаблон пока пугает посмотрите закоментированные варианты
char *decimal_to_string(float number)
{
stringstream ss (stringstream::in | stringstream::out);
ss << number;
string str = ss.str();
char *pc=new char[str.length()+1];
strcpy(pc, str.c_str());
return pc;
}
 
char *decimal_to_string(double number)
{
stringstream ss (stringstream::in | stringstream::out);
ss << number;
string str = ss.str();
char *pc=new char[str.length()+1];
strcpy(pc, str.c_str());
return pc;
}
*/
int main(int argc, char* argv[])
{
    const int magic_nbr=6;
 
    double nf[magic_nbr]={1.234, 5.678, 123.34e25, 34, -0.3131, +33434.2};
    for(int i=0; i<magic_nbr; ++i)cout<<decimal_to_string(nf[i])<<endl;
delete [] nf;
cout<<endl;
system("pause");
return 0;
}
1
BeginerMan
49 / 48 / 14
Регистрация: 17.11.2012
Сообщений: 427
01.05.2016, 22:06  [ТС] #7
Спасибо !!!
А вот float занимает 4 байта - это значит что он будет занимать char[4] ?
Т.е. 1 float можно полностью поместить в char[4] ?
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
01.05.2016, 22:08 #8
Цитата Сообщение от BeginerMan Посмотреть сообщение
А вот float занимает 4 байта - это значит что он будет занимать char[4] ?
да это так
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3295 / 448
Регистрация: 04.12.2011
Сообщений: 9,114
Записей в блоге: 5
01.05.2016, 22:10 #9
Цитата Сообщение от BeginerMan Посмотреть сообщение
.е. 1 float можно полностью поместить в char
Если char 1 байт а float 4 то да. Это зависит от реализации. И ещё важно то как Вы хотите потом обращаться к данным в массиве. Если Вам нужна с-строка то для нуля-терминатора потребуется ещё один байт.
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
01.05.2016, 22:21 #10
Цитата Сообщение от IGPIGP Посмотреть сообщение
Если Вам нужна с-строка
лелею надежду что если человек отдает себе отчет что sizeof(float)=4 то он поймет что ему не нужен терминатор ибо float нифига не c-строка
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3295 / 448
Регистрация: 04.12.2011
Сообщений: 9,114
Записей в блоге: 5
01.05.2016, 22:41 #11
Цитата Сообщение от IGPIGP Посмотреть сообщение
Если Вам нужна с-строка то для нуля-терминатора потребуется ещё один байт.
Во это глупость, действительно. Если данные переносятся во внутреннем представлении то ни о какой с-строке и речи быть не может. Это я не то сказал.
0
BeginerMan
49 / 48 / 14
Регистрация: 17.11.2012
Сообщений: 427
01.05.2016, 22:55  [ТС] #12
Спасибо !
0
hoggy
Заблокирован
02.05.2016, 04:18 #13
Цитата Сообщение от vxg Посмотреть сообщение
float x = 12.34;
char *p = (char *)&x;//теперь мы можем обращаться к байтам float по отдельности
strict aliasing rules c++ ?
не, не слышал.

https://habrahabr.ru/post/114117/

как поиметь байтовый float - и вовсе,
предмет особой олимпиады.

можно например, как то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
inline uint32_t float2bits(float src)
{
    uint32_t ret;
    memcpy(&ret,&src,sizeof(src));
    return ret;
}
 
inline float bits2float(uint32_t src)
{
    float ret;
    memcpy(&ret,&src,sizeof(src));
    return ret;
}
как сделать каст, а не копию,
лично я так сходу ответить затрудняюсь.
1
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
02.05.2016, 07:28 #14
hoggy, не совсем понял о чем вы. Код рабочий
0
BeginerMan
49 / 48 / 14
Регистрация: 17.11.2012
Сообщений: 427
02.05.2016, 09:43  [ТС] #15
Все варианты попробовал, все нормально работают, но возьму с memcpy.
Всем спасибо !
0
ValeryS
Модератор
7124 / 5392 / 669
Регистрация: 14.02.2011
Сообщений: 18,205
02.05.2016, 09:50 #16
вот еще вариантик
C++
1
2
3
4
5
6
7
8
9
10
union MyFloat
{
float flt;
char chr[sizeof(float)]
}
................
MyFloat var;
var.flt=1.0; // записали float 
for(int i=0;i<sizeof(flt);i++)// выдаем все байты
 printf("%x ",var.chr[i]);
1
cordfield
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 189
02.05.2016, 10:13 #17
vxg, код может не работать на linux и/или с компилятором gcc и включённой оптимизацией (-O3). Когда оптимизация включена, преобразования указателей, типы которых несовместимы друг с другом, компилятор будет выполнять неправильно (нарочно и обычно не выводя предупреждений об этом). То есть, поведение предложенного программного кода будет неопределено. Подробности по ссылке, которую привёл hoggy
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
02.05.2016, 10:48 #18
cordfield, моё понимание языка побуждает меня сделать вывод что такое поведение некорректно
0
cordfield
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 189
02.05.2016, 11:24 #19
vxg, по факту такое поведение есть, и я с ним сталкивался. Проблема решается добалением флага компилятора -fno-strict-aliasing, который запрещает подобные оптимизации.
0
hoggy
Заблокирован
02.05.2016, 12:44 #20
Цитата Сообщение от ValeryS Посмотреть сообщение
вот еще вариантик
я так и не понял, содержит ли такой код UB,
или нет.

Цитата Сообщение от cordfield Посмотреть сообщение
который запрещает подобные оптимизации.
нафиг нам эффективность.
нафиг нам оптимизации.
да здравствуют тормоза!
0
02.05.2016, 12:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2016, 12:44
Привет! Вот еще темы с решениями:

Как полю класса типа char* присвоить значение типа *char
Проблема в строчке 46 (не пинайте сильно за формат кода и за говнокод) ...

Вывод переменной типа char
Переменная x типа char. x = 65; cout &lt;&lt; x; Так выводиться &quot;A&quot;. x =...

проблема с переменной типа char
int count(char a){ int c=0; int words=0; while(a!='\0'){ if(a==' ')++words;...

Вывод адреса переменной типа char
Всем привет! Хочу задать вопрос... есть код: #include &lt;iostream&gt; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru