Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Darland
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
#1

Как правильно преобразовать типы данных? - C++

27.12.2008, 18:16. Просмотров 756. Ответов 2
Метки нет (Все метки)

Возможно я не очень хорошо понимаю С, но случилась такая проблема. Есть прога:
Код
unsigned char data[20];
unsigned long var1;
float var2;

data[0] = 0x10;
data[1] = 0xA1;
data[2] = 0x00;
data[3] = 0x00;
Может я совсем дурак, но дальше я пишу так:
Код
var1 = data[3] * 0x1000000 + data[2] * 0x10000 + data[1] * 0x100 + data[0];
Дело в том, что в массиве побайтно 'размана' переменная и я хочу ее 'собрать'. Но в зависимости от значений data[0] ... data[3] нехороший С делает что-то не так и var1=0xFFFF1021 (что-то типа этого) или еще хуже при data[3] = 0 и data[2] = 0x08 результат var1=0x0007A110 то есть пропадает единица! Что делать?!
А самый худший вариант, когда у меня в 3-х байтах массива:
Код
data[4] = 0x0C;
data[5] = 0x23;
data[6] = 0x56;
Записана знаковая переменная типа float которая преобразована в целочисленный формат путем умножения на 2^31. Мне нужно засунуть ее назад в float, я пишу:
Код
var2=(data[4] * 0x10000 + data[5] * 0x100 + data[6]) / pow(2,31);
И при этом я получаю вообще непредсказуемые результаты. Знак переменной определяется первым битом data[4] (в данном случае знак положительный).
Как правильно записать такого рода преобразования?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2008, 18:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно преобразовать типы данных? (C++):

Как преобразовать типы данных? - C++
есть переменные int var1; int var2; int result; я хотел бы не создавать еще 3 переменных типа double, для операции result =...

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си? - C++
Добрый вечер! Был бы очень признателен, если бы Вы помогли бы мне понять нижеследующие вопросы: 1. Можете ли на понятным для...

Не могу преобразовать типы - C++
Здравствуйте. Пишу программку в C++ Builder, ну и упёрся. Есть файл с набором значений байт, в 16-тиричной форме, т.е. 00 // 0 01 //...

Прилетают данные UTF-8, как правильно преобразовать в читабельный вид? - C++
Как преобразовать вот это: cout << buf<<endl; Выдает в UTF-8 кодировке: 01%3Aasd+%D0%92%D0%B0%D1%81%D0%B8%D0%BB%D0%B8%D0%B9 ...

Не получается преобразовать типы указателей на функцию - C++
Доброго всем времени суток. Подскажите пожалуйста как сделать есть тип указателя на функцию. typedef void (*pfn_RawMouseOnLeftDown ...

Как записывать и считывать не POD типы данных из бинарного файла? - C++
Есть класса в котором часть полей не базовых динамических типов например vector list и подобные. Как записать экземпляр класса в бинарный...

2
Stan
Сообщений: n/a
28.12.2008, 10:58 #2
Ну, во первых, учти, что число в памяти компьютера хранится в обратном порядке, т.е., к примеру, число
long a=1000;
будет в памяти лежать так:
0xE8|0x03|0x00|0x00

в твоем случае число
data[0] = 0x10;
data[1] = 0xA1;
data[2] = 0x00;
data[3] = 0x00;
это 41232,
а получить его в переменную типа long просто:

var1=*((long*)data);

эта конструкция преобразует адрес начала массива к указателю
типа long, а затем дергает значение с этого адреса (тип long - в памяти занимает четыре байта)
chernav
0 / 0 / 0
Регистрация: 25.11.2008
Сообщений: 10
04.01.2009, 17:20 #3
А вообще попробуй на массив reinterpret_cast<long>.Авось что получиться
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2009, 17:20
Привет! Вот еще темы с ответами:

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

Ошибка: ни одна из перегрузок не может преобразовать все типы аргументов - C++
#include &quot;stdafx.h&quot; #include &quot;CppUnitTest.h&quot; #include &quot;/My Documents/Visual Studio...

C2665: pow: ни одна из 6 перегрузок не может преобразовать все типы аргументов - C++
пожалуйста пожалуйста подскажите в чом проблема................Как исправить??????? пожалуйста #include &lt;stdio.h&gt; ...

Как не писать один и тот же код, для функции, принимающей разные типы данных в качестве аргумента - C++
Проблема такая: есть некая функция. Внутри нее происходят одни и теже вычисления, вне зависимости от типа входных данных. void...


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

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

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