Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 03.12.2022
Сообщений: 229

Перетипирование char c[8] в double

11.05.2023, 16:55. Показов 1969. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть 8 байтов данных в интерпретации массива чаров. Нужно перетипировать эти данные в интерпретацию double.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2023, 16:55
Ответы с готовыми решениями:

Делегат Func<Action<char>, bool, double, double>
Задание: реализуйте пользовательский тип делегата требуемой сигнатуры и выполните с его использованием вызов нескольких методов (с...

[Error] cannot convert 'double (*)(double)' to 'double' for argument '1' to 'double pow(double, double)'
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main () { system(&quot;cls&quot;); double x,y; system (&quot;echo...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

39
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
11.05.2023, 16:56
std::memcpy из массива в переменную типа double. Готово.
0
 Аватар для vlisp
1059 / 980 / 153
Регистрация: 10.08.2015
Сообщений: 5,318
11.05.2023, 19:22
смотри какие шустрые...
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
11.05.2023, 19:27
C++
1
2
3
4
5
6
7
8
9
10
11
union X
{
    char c[8];
    double a;
};
int main()
{
    X x;
    x.c[0]='a';.... x.c[7]='z';
    double dx=x.a;
}
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
12.05.2023, 09:16
C++
1
2
3
4
5
6
int main()
{
    const char *ch = "\xcd\xcc\xcc\xcc\xcc\xdc\x5e\x40";
    double d = *((double*)ch);
    std::cout << d;
}
Выводит:
123.45
0
0 / 0 / 0
Регистрация: 03.12.2022
Сообщений: 229
12.05.2023, 16:40  [ТС]
Вот зачем искажать условие задачи. У меня не char*, потоков у меня нет.

_________________________

По опытам. Кака и следовало ожидать, результат неопределенный (возможно, баги Qt v.5.3) - и только методом повторения находится истина.

В std:: нет memcpy.

В QByteArray не работают методы .toDouble, .toInt и т.д. - все время возвращая 0.

union char[8] и double дает один результат. memcpy в составе memory.h дает 2 разных результата с источником char[8] или QByteArray на 8 элементов (проблема не в перевернутости байтов, если бы речь шла о LittLeEndian или какой-то похожей фигне).

Итог: «union char[8] и double» = "memcpy(&double, &char[8], 8)".

Немного измененный код, но все же.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
QByteArray qbaInput;
 
    qbaInput.append(255);
    qbaInput.append(1);
    qbaInput.append(4);
    qbaInput.append(9);
    qbaInput.append(12);
    qbaInput.append(255);
    qbaInput.append(1);
    qbaInput.append(4);
 
const QByteArray qRes = qbaSubBytes(qbaInput, 0, 8);
    double d1 = dQByteArray_To_Double(qRes); //union.
    double d2; //memcpy для QByteArray;
    double d3; //memcpy для char[8];
 
    char c[8];
    for (int i=0; i<8; i++) c[i] = qRes[i];
 
    memcpy(&d2, &qRes, 8);
    memcpy(&d3, &c, 8);
Миниатюры
Перетипирование char c[8] в double   Перетипирование char c[8] в double  
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.05.2023, 16:49
Цитата Сообщение от My_Vse_Nubasiki Посмотреть сообщение
В std:: нет memcpy.
std::memcpy объявлен в <cstring>
https://en.cppreference.com/w/... yte/memcpy

Цитата Сообщение от My_Vse_Nubasiki Посмотреть сообщение
memcpy в составе memory.h дает 2 разных результата с источником char[8] или QByteArray на 8 элементов
Потому что вот это некорректно:
Цитата Сообщение от My_Vse_Nubasiki Посмотреть сообщение
memcpy(&d2, &qRes, 8);
Нужно делать так
C++
1
memcpy(&d2, qRes.data(), 8);
Добавлено через 2 минуты
Цитата Сообщение от My_Vse_Nubasiki Посмотреть сообщение
QByteArray не работают методы .toDouble, .toInt и т.д. - все время возвращая 0.
Это методы для текстового представления чисел, а не для двоичного.
Читайте документацию внимательнее:
Warning: The QByteArray content may only contain valid numerical characters which includes the plus/minus sign, the character e used in scientific notation, and the decimal point. Including the unit or additional characters leads to a conversion error.
https://doc.qt.io/qt-6/qbytearray.html#toDouble
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
12.05.2023, 17:12
Цитата Сообщение от My_Vse_Nubasiki Посмотреть сообщение
Вот зачем искажать условие задачи. У меня не char*, потоков у меня нет.
???

Цитата Сообщение от My_Vse_Nubasiki Посмотреть сообщение
По опытам. Кака и следовало ожидать, результат неопределенный (возможно, баги Qt v.5.3) - и только методом повторения находится истина.
???

Цитата Сообщение от My_Vse_Nubasiki Посмотреть сообщение
В std:: нет memcpy.
Это как это ? https://en.cppreference.com/w/... yte/memcpy

Цитата Сообщение от My_Vse_Nubasiki Посмотреть сообщение
В QByteArray не работают методы .toDouble, .toInt и т.д. - все время возвращая 0.

union char[8] и double дает один результат. memcpy в составе memory.h дает 2 разных результата с источником char[8] или QByteArray на 8 элементов (проблема не в перевернутости байтов, если бы речь шла о LittLeEndian или какой-то похожей фигне).
Вот зачем искажать условие задачи? Вас не интересует QByteArray. Вас интересует char [8].
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
12.05.2023, 17:12
Цитата Сообщение от My_Vse_Nubasiki Посмотреть сообщение
У меня не char*,
Расскажите разницу между char[8] и char* ? Не философски (где разница есть), а применительно к этой задаче и предложенному мною решению.

Если это замечание к моему коду - то я написал char * только потому, что при использованном мною формате инициализации не получается использовать char[8], т.к. к строке безусловно приписывается 0, который для нашей задачи не важен совершенно. А писать пример с посимвольным заполнением мне было лень писать, можете проделать это самостоятельно.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
12.05.2023, 17:34
Цитата Сообщение от KSergey9 Посмотреть сообщение
а применительно к этой задаче и предложенному мною решению.
Предложенное вами решение обладает неопределенным поведением.
1
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
12.05.2023, 17:47
Есть какой-то нюанс с порядком отображения байтов в памяти.
Для int я знаю про перестановку байтов на Intel-платформах, а вот про double мне как-то удивительно. Думал там такого нет.

Вот пример:

C++
1
2
3
4
5
6
int main()
{
    const char* ch = "\x00\x00\x00\x00\x00\x00\xA0\x40"; //  0x40A0000000000000
    double d = *((double*)ch);
    std::cout << d;
}
Выводит 2048, всё как бы хорошо.

Хотя любой online-калькулятор (да и просто из описания формата) число 2048 в double выглядит как 0x40A0000000000000
Вполне возможно, что ТС как раз бьётся об этот угол.

Добавлено через 3 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Предложенное вами решение обладает неопределенным поведением.
Скажу грубовато, но так-то с юмором: идите ка вы лесом с этими заумами про UB
Реинтерпретация указателей будет работать в Си (и ++) всегда, потому как это единственное вкусное что в нём есть. Без этого базиса этот язык вообще теряет всякий смысл.

Более того я уверен, что тут вопрос формализма именно плюсового, но я даже вот не хочу в этот идиотизм вникать, уж извините (поверьте, это не к вам лично все эпитеты). Просто с UB плюсисты ну очень любят носиться как с писаной торбой, в каждом стандарте изобретая новые UB и новые форматы "как правильно", хотя суть-то проста: реинтерпретация указателя.

Если знаете как написать по полному плюсовому феншую - напишите, плиз.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
12.05.2023, 17:48
Цитата Сообщение от KSergey9 Посмотреть сообщение
Для int я знаю про перестановку байтов на Intel-платформах, а вот про double мне как-то удивительно. Думал там такого нет.
Какая разница, что там есть или нет?

В С++ не разрешается читать память char [8] как память double через приведение указателя. Поведение не определено.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Скажу грубовато, но так-то с юмором: идите ка вы лесом с этими заумами про UB
Этот формум именно об этом.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Реинтерпретация указателей будет работать в Си (и ++) всегда, потому как это единственное вкусное что в нём есть. Без этого базиса язык вообще теряет всякий смысл.
Нет. Никому это "вкусное" не нужно и никода не было нужным. Переинтерпетация памяти в С и С++ не работает и не работатет уже давно. Со времен массвого распространиния strict-aliasing оптимизаций уже много воды утекло. Криворукие "кулхацкеры" уже отвылись-отплакались да забыли.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
12.05.2023, 17:51
TheCalligrapher,
ну при чем тут уже плюсы эти пресловутые??

Есть байты в памяти, как их интерпретировать - дело абсолютно произвольное; результат будет зависеть именно от интерпретации байтов в памяти, а не от синтаксиса языка.

И, кстати, union даёт абсолютно идентичный результат, если что. Так что в данном случае, считаю, вы хоть и правы формально, но по сути это не ответ на озвученный вопрос: что с порядком байтов в представлении double ?? (эпыты на online-компиляторе, так что что у них там за платформа - не знаю; но от чего-то уверен, что intel)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
12.05.2023, 17:53
Цитата Сообщение от KSergey9 Посмотреть сообщение
Если знаете как написать по полному плюсовому феншую - напишите, плиз.
Так ужеж написали.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
12.05.2023, 17:53
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Этот формум именно об этом.
Как я уже сказал - я признаю за вами формальную правоту в рамках C++.
Однако, коль скоро через С++ мы таки можем "заглянуть" в память - можете вы сказать в чем тут дело?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
12.05.2023, 17:57
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так ужеж написали.
Если вы вот про этот ваш ответ
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
std::memcpy из массива в переменную типа double. Готово.
то расскажите в чем разница. Я вообще не догоняю.

Только не про UB, а физически - в чем разница?? откуда она возьмётся??

Добавлено через 2 минуты
PS
А я пока ушел про Strict Aliasing читать. Спасибо!
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
12.05.2023, 17:59
Цитата Сообщение от KSergey9 Посмотреть сообщение
Однако, коль скоро через С++ мы таки можем "заглянуть" в память - можете вы сказать в чем тут дело?
В компиляторе, конечно, как и практически всегда в случае UB.

Компилятор знает, что по правилам языка информационной зависимости между такими char [8] и double нет, то есть значение double не зависит от значения char [8]. Поэтому он может запросто переставить чтение double выше, еще до того, как память char [8] была проинициализирована.

Или компилятор может просто заметить, что вы занимаетесь нелегальной формой переинтерпретации памяти и просто безусловно всегда читать 0 вам назло. А может просто выкинуть чтение double из сгенерированного кода вообще.

И даже если отвлечься от компилятора, тут есть еще run-time тонкости с требованиями выравнивания.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
12.05.2023, 20:52
Цитата Сообщение от zss Посмотреть сообщение
double dx=x.a;
UB.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
12.05.2023, 21:01
TheCalligrapher,
Короче сыскал я ответ:
Порядок байтов: little-endian, то есть обратный, как и во всех интелах
Всё у их через одно место, короче. В общем неожиданно.

А то что вы рассказываете - всё это конечно похвально. И в общем даже абсолютно верно. Только вот ни одна из страшилок UB не реализовалась, как видим. Да, это единственный, частный случай и всё такое, я понимаю.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.05.2023, 21:20
Цитата Сообщение от KSergey9 Посмотреть сообщение
Только вот ни одна из страшилок UB не реализовалась, как видим.
В таком-то простом коде? Они, эти "страшилки" (забавно конечно, что вы именно так это воспринимаете - с каким-то пренебрежением, хотя я уверен, что совершенно необоснованным, вам просто кажется, что это не имеет никакого значения, потому что сами с таким никогда не сталкивались, а все, кто вокруг считает иначе, просто какие-то глуповатые, и это единственное обоснование для вашего скепсиса) проявляются как правило в полный рост во взрослом коде, когда у компилятора нет всей очевидной картины, и не факт что это будет именно платформа Intel. Например, на видимые проблемы с выравниванием вы налетите, например, на Sparc, а на Intel скорее всего обойдетесь лишь незначительным снижением производительности.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2023, 21:20
Помогаю со студенческими работами здесь

Из Char в Double
Здравствуйте, не подскажет ли кто , как можно массив char переделать в double Например: char={'0' , ',' , '5555'} double x=0.0;

char в double
Как превратить char в double? Я хочу написать программу в которой вводится два числа и в результате выводится число типа double. Думал...

double в char
при касте double в char значение double всегда будет округляться в меньшую сторону?

Реализация double to char*
Здравствуйте, помогите пожалуйста с реализацией функции double to char*. У функции 2 аргумента char*(размер этого массива больше, либо...

Перевод double в char
char buff; float volt = readADC()*0.02932; // Тут в итоге получится должно 1.46 или что-нибудь такое. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru