|
Перевод WORD в строчный WORD или INT, Функции или библиотеки |
|
|
|
Mar 7 2017, 08:04
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Aldec @ Mar 7 2017, 11:18)  Вроде раздел средства разработки и вопрос в общем в каком компиляторе есть функции или готовые процедуры конвертирования DWORD в int array[ ] http://cppstudio.com/post/389Вторая страница пошла (я понимаю, форуму хорошо - реклама-шрэклама…), куда катится этот мир (; http://publ.lib.ru/ARCHIVES/Z/ZLOBIN_Vladi...cessorah.(1991).[djv-fax].zip Ну и совсем по-пионэрски: CODE void BIN_TO_BCD (uint32_t* bcd) //============================================================================== // Подпрограмма преобразования 64-х разрядного двоичного (BIN) числа в // упакованный двоично-десятичный (BCD) формат. //============================================================================== #define _tetrad_mask (0x0000000Fu) #define _tetrad_lmt (0x00000004u) #define _tetrad_crrctn (0x00000003u) { uint32_t shift_rg[5] = {bcd[0], bcd[1], 0, 0, 0}, i = 0x00000040,// счетчик цикла по входному регистру t, t_l, t_c; int32_t j;// счетчик цикла по тетрадам BCD-регистра do { j = 0x0000001C; do { t = (_tetrad_mask << j); t_l = (_tetrad_lmt << j); t_c = (_tetrad_crrctn << j); if ((shift_rg[2] & t) > t_l) { shift_rg[2] = shift_rg[2] + t_c; }; if ((shift_rg[3] & t) > t_l) { shift_rg[3] = shift_rg[3] + t_c; }; if ((shift_rg[4] & t) > t_l) { shift_rg[4] = shift_rg[4] + t_c; }; j =j - 4; } while (j >= 0);
shift_rg[4] = shift_rg[4] << 1; if (shift_rg[3] & 0x80000000) { shift_rg[4] = (shift_rg[4] | 0x00000001); }; shift_rg[3] = shift_rg[3] << 1; if (shift_rg[2] & 0x80000000) { shift_rg[3] = (shift_rg[3] | 0x00000001); }; shift_rg[2] = shift_rg[2] << 1; if (shift_rg[1] & 0x80000000) { shift_rg[2] = (shift_rg[2] | 0x00000001); }; shift_rg[1] = shift_rg[1] << 1; if (shift_rg[0] & 0x80000000) { shift_rg[1] = (shift_rg[1] | 0x00000001); }; shift_rg[0] = shift_rg[0] << 1;
i = i - 1; } while (i != 0);
bcd[2] = shift_rg[2]; bcd[3] = shift_rg[3]; bcd[4] = shift_rg[4]; }
//Определили, к примеру: uint32_t BnrCdDcmls[5]; //Задали: BnrCdDcmls[0] = младшие_32_разряда; BnrCdDcmls[1] = старшие_32_разряда; //Вызвали: BIN_TO_BCD ((uint32_t*)&BnrCdDcmls); //Получили: с BnrCdDcmls[2] по BnrCdDcmls[4] тетрадами (это по 4 бита - если слово незнакомое) двоично-десятичное представление; //ну и уж дальше рассортируете. Чесслово, за время треда уже и книжку бы прочитали и первый вариант кода проверить успели бы…
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Mar 7 2017, 08:45
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Obam @ Mar 7 2017, 10:04)  //Определили, к примеру: uint32_t BnrCdDcmls[5]; Вот сразу уже и не подходит. Требовалось WORD. QUOTE (Obam @ Mar 7 2017, 10:04)  тетрадами Снова мимо - надо было int.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 7 2017, 09:19
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Сергей Борщ @ Mar 7 2017, 12:45)  Вот сразу уже и не подходит. Требовалось WORD. Лично я остановился на WORD'97… Если закопаться в своих архивах (но я этого делать не стану  ), то найду подобное и для mcs51, а там word (машинное слово, так ведь?) вообще 8 бит… Цитата Снова мимо - надо было int.  Ни фига: именно int надо "декомпозировать"  , Причём TC, упоминая MODF, похоже считает, что int так же сложно устроен, что и float. Примем дополнение до 2-х, как формат (старший разряд знаковым) - будет int, не примем - не будет.  Ну пусть человек, хоть посмотрит-подумает, голова, она ведь не только чтоб в неё есть… а по поводу "за время треда уже и книжку бы прочитали…", я так понимаю, возражений нет (;
Сообщение отредактировал Obam - Mar 7 2017, 09:24
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Mar 8 2017, 08:11
|
Частый гость
 
Группа: Участник
Сообщений: 160
Регистрация: 21-06-16
Пользователь №: 92 272

|
Вы имеете ввиду что в каком то x86 МК есть аппаратный конвертер Цитата(Obam @ Mar 7 2017, 08:04)  //Получили: с BnrCdDcmls[2] по BnrCdDcmls[4] тетрадами (это по 4 бита - если слово незнакомое) двоично-десятичное представление; На выходе конвертации должен быть как минимум полубайт десятых или сотых десятичного значения например 1111 на выходе 0001 и 0101 т.е 15 ковертируется INT [1,5]
|
|
|
|
|
Mar 8 2017, 10:17
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
"Понесли кроссовки Митю...". Не знаю в каком году вы впервые увидели как унутре себя работает процессор, но книжицу по ссылке всё же почитайте; просветлению, определённо, способствует...
Ну естественно, 15 в шестнадцатиричном представлении - 0FH, в двоичном - 1111B, в двоично-десятичном будет 15H, а в виде ASCIZ 31H, 35H, 00H А что не так? После: BnrCdDcmls[0] = 0x0000000F; BnrCdDcmls[1] = 0x00000000; BIN_TO_BCD ((uint32_t*)&BnrCdDcmls); вы не получили 0x00000015 в BnrCdDcmls[2]?
Ваши исходные 1250: BnrCdDcmls[0] = 1250; BnrCdDcmls[1] = 0; BIN_TO_BCD ((uint32_t*)&BnrCdDcmls); не дали 0x00001250 в BnrCdDcmls[2]?
64 двоичных разряда (два слова в ARM-архитектуре, откуда и дан пример) составляют число из 24-х десятичных разряднов.
И ещё, INT[1,5] это по-каковски?
Сообщение отредактировал Obam - Mar 8 2017, 10:23
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Mar 8 2017, 14:36
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Aldec @ Mar 8 2017, 16:50)  Вам покажется странным но в Си, инициализация массива выглядит как int A[ 10 ] Нет не покажется  , но "объявление массива", давайте будем терминологически точными; инициализация несколько иное явление - нулями по умолчанию, но можем явно указать чем, а можем (не забывайте - форум про микроконтроллеры) поместить в неинициализируемую область. Цитата Надо также заметить что он т.е. Си принят что то вроде стандартом или по умолчанию и поэтому в вопросе подразумевается Си Также в Си есть деление по модулю с возвратом остатка т.е. один из различных вариантов для конвертации в массив это A[ ] = B%10. Ну ща вам прилетит: B - это что? А в скобочках что?
--------------------
Пролетарий умственного труда.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|