Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 21.03.2005, 17:49   [включить плавающее окно]   #1
b3st<art>
Мужской Общительный
Автор темы
 
Аватар для b3st<art>
 
Регистрация: 31.03.2004
Адрес: Россия>Н.Новгород
Функция для С++.

Подскажите как написать функцию, которая будет преобразовывать 2 байта формата CHAR в один SHORT...
__________________
|| Timeo Danaos et donna ferentes ||
b3st<art> вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 21.03.2005, 22:30   [включить плавающее окно]   #2
equ
Начинающий
 
Регистрация: 20.12.2003
Адрес: Москва
Один байт умножить на 256 и прибавить второй?
equ вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 22.03.2005, 08:24   [включить плавающее окно]   #3
@LeFaNt
Мужской Интересующийся
 
Регистрация: 30.06.2004
умножить это некрасиво
не уверен как это будет в С, но что-то примерно такое
(short) ch1 << 8 + ch2
<< это в си вроде сдвиг влево (1 сдвиг эквивалентен умножению на 2)
(затрудняюсь сказать про преобразование типов, поскольку на си не пишу)
@LeFaNt вне форума  
Ответить с цитированием
Непрочитано 22.03.2005, 10:02   [включить плавающее окно]   #4
Sanya
Мужской Опытный
 
Аватар для Sanya
 
Регистрация: 22.03.2003
Адрес: Апатиты
Цитата (b3st<art>) »
которая будет преобразовывать 2 байта формата CHAR в один SHORT
если два подряд, то просто приведением указателя с последующим разыменованием, навроде такого:
char ch[2];
i = *((short*)ch);
__________________
Лечить и судить умеют и могут все, а вот рассчитать несущую балку?
Sanya вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 22.03.2005, 17:29   [включить плавающее окно]   #5
b3st<art>
Мужской Общительный
Автор темы
 
Аватар для b3st<art>
 
Регистрация: 31.03.2004
Адрес: Россия>Н.Новгород
Sanya
Именно 2 подряд...
И если не трудно разъясни про *. Как они деёствуют??
Сорри... что-то меня совсем стукнуло... =)
Все понятненько.
__________________
|| Timeo Danaos et donna ferentes ||

Последний раз редактировалось b3st<art>; 22.03.2005 в 17:40.
b3st<art> вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 23.03.2005, 02:39   [включить плавающее окно]   #6
passer-by
Общительный
 
Регистрация: 16.12.2003
Sanya
Прежде чем преобразовывать, необходимо оговорить условие какой из char’ов должен занять старший байт short’а, а какой младший. Преобразование, предложенное Sanya, платформеннозависимо.
passer-by вне форума  
Ответить с цитированием
Непрочитано 23.03.2005, 04:13   [включить плавающее окно]   #7
CapOne
Мужской Умудрённый
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
@LeFaNt
Тогда уж
c = ( ( ((short)high) << 8 ) | ( (short)low ) );
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.
CapOne вне форума  
Ответить с цитированием
Непрочитано 23.03.2005, 05:52   [включить плавающее окно]   #8
@LeFaNt
Мужской Интересующийся
 
Регистрация: 30.06.2004
CapOne нет предела совершенству 8-)
но вариант от Sanya еще круче
@LeFaNt вне форума  
Ответить с цитированием
Непрочитано 23.03.2005, 10:15   [включить плавающее окно]   #9
Sanya
Мужской Опытный
 
Аватар для Sanya
 
Регистрация: 22.03.2003
Адрес: Апатиты
Цитата (b3st<art>) »
И если не трудно разъясни про *. Как они деёствуют??
Цитата (Sanya) »
char ch[2];
i = *((short*)ch);
У нас есть два байта -- в виде массива символов, или строки, кому какой термин ближе/понятнее. При объявлении массива мы фактически создаем константный указатель на начало выделенной под этот массив области памяти. Далее -- всё просто, ловкость рук и никакого мошенства.
(short*)ch -- указатель приводится к типу short*, т.е. теперь та память, на которую он (указатель) указывает, рассматривается как short int
*((short*)ch) -- разыменование, т.е. обращение по указателю; результат операции -- целое 2-байтное число, собранное из двух символов
i = *((short*)ch) -- это число сохраняем в переменную i
Цитата (passer-by) »
Преобразование, предложенное Sanya, платформеннозависимо.
ну да, есть такое дело.. всё в рамках архитектуры x86 -- младший байт храним по младшему адресу.
__________________
Лечить и судить умеют и могут все, а вот рассчитать несущую балку?
Sanya вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 24.03.2005, 13:14   [включить плавающее окно]   #10
Barloggg
Мужской Продвинутый
 
Аватар для Barloggg
 
Регистрация: 11.03.2003
Адрес: Тьмутаракань2, лен. обл
а вот в дельфи можно сделать так
type a=record
case Word of
0: (AsInt: Word);
1: (AsChar: packed array[0..1]of Char);
end;
end;
и всего делов...
Barloggg вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 24.03.2005, 17:24   [включить плавающее окно]   #11
b3st<art>
Мужской Общительный
Автор темы
 
Аватар для b3st<art>
 
Регистрация: 31.03.2004
Адрес: Россия>Н.Новгород
Sanya
На самом деле очень красиво. И практично. Браво. не знаю откуда такие познания, но это внушает уважение.
На счет разъяснения я написал что все понял. Но за такое расписывание спасибо, подтведились мои подозрения =)))).
Barloggg
Ну на С++ тоже так можно сделать. Хотелось бы покороче.
__________________
|| Timeo Danaos et donna ferentes ||

Последний раз редактировалось b3st<art>; 25.03.2005 в 17:15.
b3st<art> вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 25.03.2005, 13:03   [включить плавающее окно]   #12
Sanya
Мужской Опытный
 
Аватар для Sanya
 
Регистрация: 22.03.2003
Адрес: Апатиты
Цитата (Barloggg) »
а вот в дельфи можно сделать так
кстати, еще одно решение -- через union:
Код:
union xxx
{
    char ch[2];
    short int i;
} x;

x.ch[0] = 0xFF;
x.ch[1] = 1;

cout<<x.i<<endl;  // выдаст 511
не подумайте, что выпендриваюсь...
__________________
Лечить и судить умеют и могут все, а вот рассчитать несущую балку?
Sanya вне форума  
Конфигурация ПК
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 12:29. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey