Перейти к содержанию
    

Перевод WORD в строчный WORD или INT

Вроде раздел средства разработки и вопрос в общем в каком компиляторе есть функции или готовые процедуры конвертирования DWORD в int array[ ]

 

 

Изменено пользователем Aldec

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в каком компиляторе есть функции или готовые процедуры конвертирования DWORD в int array[ ]
Ни в каком нет. Читать учебник вам все-же придется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде раздел средства разработки и вопрос в общем в каком компиляторе есть функции или готовые процедуры конвертирования DWORD в int array[ ]

 

http://cppstudio.com/post/389

Вторая страница пошла (я понимаю, форуму хорошо - реклама-шрэклама…), куда катится этот мир (;

http://publ.lib.ru/ARCHIVES/Z/ZLOBIN_Vladi...cessorah.(1991).[djv-fax].zip

 

Ну и совсем по-пионэрски:

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 бита - если слово незнакомое) двоично-десятичное представление;

//ну и уж дальше рассортируете.

 

Чесслово, за время треда уже и книжку бы прочитали и первый вариант кода проверить успели бы…

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

//Определили, к примеру:

uint32_t BnrCdDcmls[5];

Вот сразу уже и не подходит. Требовалось WORD.

тетрадами
Снова мимо - надо было int.

 

:biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот сразу уже и не подходит. Требовалось WORD.

Лично я остановился на WORD'97…

Если закопаться в своих архивах (но я этого делать не стану :) ), то найду подобное и для mcs51, а там word (машинное слово, так ведь?) вообще 8 бит…

 

Снова мимо - надо было int.

 

:biggrin:

Ни фига: именно int надо "декомпозировать" ;), Причём TC, упоминая MODF, похоже считает, что int так же сложно устроен, что и float.

 

Примем дополнение до 2-х, как формат (старший разряд знаковым) - будет int, не примем - не будет. :)

 

Ну пусть человек, хоть посмотрит-подумает, голова, она ведь не только чтоб в неё есть… а по поводу "за время треда уже и книжку бы прочитали…", я так понимаю, возражений нет (;

Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Упоминание MODF и других функций только для намека на тип функций, то что она из раздела конвертирования. BCDTODEC или BINTOBCD

Тема больше про оптимальные варианты конвертации или более компактные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Упоминание MODF и других функций только для намека на тип функций, то что она из раздела конвертирования. BCDTODEC или BINTOBCD

Тема больше про оптимальные варианты конвертации или более компактные.

Для начала укажите тип процессора и язык программирования.

x86?

Васик, питон, жабаскрипт?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы имеете ввиду что в каком то x86 МК есть аппаратный конвертер

 

//Получили: с BnrCdDcmls[2] по BnrCdDcmls[4] тетрадами (это по 4 бита - если слово незнакомое) двоично-десятичное представление;

На выходе конвертации должен быть как минимум полубайт десятых или сотых десятичного значения например

 

1111 на выходе 0001 и 0101 т.е 15 ковертируется INT [1,5]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Понесли кроссовки Митю...".

Не знаю в каком году вы впервые увидели как унутре себя работает процессор, но книжицу по ссылке всё же почитайте; просветлению, определённо, способствует...

 

Ну естественно, 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам покажется странным но в Си, инициализация массива выглядит как int A[ 10 ], поэтому не должно вызывать затруднений,

Надо также заметить что он т.е. Си принят что то вроде стандартом или по умолчанию и поэтому в вопросе подразумевается Си

Также в Си есть деление по модулю с возвратом остатка т.е. один из различных вариантов для конвертации в массив это A[ ] = B%10.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам покажется странным но в Си, инициализация массива выглядит как int A[ 10 ]

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

Надо также заметить что он т.е. Си принят что то вроде стандартом или по умолчанию и поэтому в вопросе подразумевается Си

Также в Си есть деление по модулю с возвратом остатка т.е. один из различных вариантов для конвертации в массив это A[ ] = B%10.

Ну ща вам прилетит: B - это что? А в скобочках что?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. один из различных вариантов для конвертации в массив это A[ ] = B%10.
Ну так и используйте его. Зачем тему было заводить? :lol:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да раздел про МК а также "How-to, тонкости работы со средствами разработки" это подразумевает тонкости, фишки...

 

разделить DWORD на 10 это не на 2, поэтому вопрос про тонкости и фишки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там не совсем ясно какой конвертер круче, на делении на 10 или сдвиге 3,30

 

http://www.microchip.su/showthread.php?t=2162

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...