Страница 1 из 1

Арифметические программы на языке С для AVR и PIC

СообщениеДобавлено: 03 ноя 2013, 18:39
Ewgen
При выполнении арифметических действий оба числа должны иметь одинаковую размерность или могут быть разной объявленной длины ? Мне нужны примеры вычислений.

Re: Арифметические программы на языке С для AVR и PIC

СообщениеДобавлено: 04 ноя 2013, 10:59
ASD
Наберите в любом поисковике "Приведение типов".

Re: Арифметические программы на языке С для AVR и PIC

СообщениеДобавлено: 04 ноя 2013, 11:37
Pavel
Здравствуйте, Ewgen.
Нет размерность в битах не имеет значения. Например, число с размерностью 1 байт можно приравнять к числу с размерностью в 2 байта.
Например,
a-размерность 2 байта
b-размерность 1 байт

a=4200; b=a;

b, после выполнения операции присваивания значения a, будет равно 104, так как b максимально может иметь условное значение 256 (0..255). Значит b=4200-16*256. То есть число b 16 раз переполнится (обнулится), прежде чем операция присваивания значения будет выполнена.

Re: Арифметические программы на языке С для AVR и PIC

СообщениеДобавлено: 04 ноя 2013, 12:13
Pavel
И да, забыл добавить.
Если совсем просто считать, то однобайтовая переменная будет равна первому байту двухбайтового числа, то есть
a=20450 (или в двоичной системе отсчета 01001111 11100010)
b=a;
b будет равно после операции присваивания 226 (или в двоичной системе отсчета 11100010)

Re: Арифметические программы на языке С для AVR и PIC

СообщениеДобавлено: 05 ноя 2013, 10:14
Ewgen
ASD спасибо.
Уважаемый Pavel, спасибо за пример. В правилах приведения типов говорится о том, что при присвоении значения длинной переменной короткой, у длинной переменной младшие биты отбрасываются и короткой переменной присваиваются старшие биты.
В арифметических программах, как я понял, желательно к коротким переменным подставлять тип наибольшего.
Например :
int x;
char c=30;
x=(int)c*10;
Величина char c=30 будет взята как int c=30 для вычислений. Здесь char восьмибитная а int шестнадцатибитная переменная.

Re: Арифметические программы на языке С для AVR и PIC

СообщениеДобавлено: 05 ноя 2013, 14:52
Pavel
"В правилах приведения типов говорится о том, что при присвоении значения длинной переменной короткой, у длинной переменной младшие биты отбрасываются и короткой переменной присваиваются старшие биты."

Это правило, как говорится, на все случаи жизни, но люди создающие компиляторы выбирают простой путь, так как память МК не позволяет разгуляться на переменных. Пример на C и на ассемблере (как переводит компилятор с C в ассемблер).

a=2000.

b=a.

MOVLW 208
MOVWF _a+0
MOVLW 7
MOVWF _a+1

MOVLW 208
MOVWF _b+0

Что касается вашего примера, то тут есть два случая:
1) Если переменной char присвоено значение (в вашем случае 30) то строчки x=(int)c*10 и x=c*10 будут иметь одинаковое количество команд на ассемблере, то есть компилятор сам все подсчитает и упростит.
2) Если переменной char не присвоено значение, то строчка x=(int)c*10 будет занимать больше команд на ассемблере, чем строчка x=c*10, так как грамотно написанный компилятор подсчитает все возможные варианты и выделит памяти по максимуму.

Я эти примеры привел к тому, что компилятор для МК не есть компилятор для ПК, так как количество команд для компиляторов для ПК и МК разное.

Re: Арифметические программы на языке С для AVR и PIC

СообщениеДобавлено: 26 июл 2018, 21:03
Ewgen
Как присвоить значения таймера TMR1H TMR1L ( контроллер PIC16) двухбайтной или четырёхбайтной переменной ?

Re: Арифметические программы на языке С для AVR и PIC

СообщениеДобавлено: 17 апр 2019, 10:25
Ewgen
В Micro C PRO for PIC v 4.15
unsigned int Taimer1; // 16 bit
unsigned short TH. TL; // 8 bit

TH=TMR1H;// старший байт
TL=TMR1L; // младший байт

Taimer1=0;
Taimer1=Taimer1+TH; // сложить c TH
Taimer1=Taimer1<<8; // сдвинуть влево на 8 бит сделать старшим байтом в двухбайтной переменной Taimer1
Taimer1=Taimer1+TL; // сложить с младшим байтом TL всё работает нормально