Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
11.02.2011, 12:15
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,532
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Re: Работать с битами в переменной "С" помогите
Сообщение от 7Fantomas7
|
Я смысл выражения не пойму.
|
Ну и как вы будете писать программы, если такого простого не понимаете?
|
|
|
|
14.02.2011, 11:37
|
|
Заблокирован
Регистрация: 23.03.2008
Адрес: Ukraine
Сообщений: 1,306
Сказал спасибо: 1,749
Сказали Спасибо 1,878 раз(а) в 493 сообщении(ях)
|
Re: Работать с битами в переменной "С" помогите
Сообщение от ut1wpr
|
ну получили результат 00000001 в скобках и что? А где сравнение со значением 0 или 1. Т.е. само условие "если чтото равно чемуто" или "если чтото не равно чемуто" или "больше/меньше"
|
Это в паскале нужно обязательно сравнивать с чем-то, а в С -
само сравнение в операторе if (оператор if сравнивает с нулем).
Т.е. если в скобках получается все что угодно кроме нуля, то выражение считается истинным.
Офф. Вроде бы простой вопрос сам его понимаю, а как объяснил не знаю, понятно или нет (но большинство моментов требуют "внутреннего переваривания" - т.е.как в философии переход количества в качество).
Хотя никто не запрещает написать явно: if ((Var1 & Var2)==0), но в С так не принято (С-программисты начинают обзываться).
Последний раз редактировалось igor1000; 14.02.2011 в 11:45.
Причина: Добавка
|
|
|
|
14.02.2011, 11:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Работать с битами в переменной "С" помогите
Без аргумента - булево сравнение.
|
|
|
|
14.02.2011, 12:06
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Работать с битами в переменной "С" помогите
Сообщение от igor1000
|
Хотя никто не запрещает написать явно: if ((Var1 & Var2)==0), но в С так не принято (С-программисты начинают обзываться).
|
Ерунда какая! Кому как нравится, тот так и пишет. Просто такая запись длиннее, чем И вообще любое выражение имеет свое значение и может быть использовано в качестве условного. Например, В данном случае в операторе if происходит присваивание значения одной переменной другой. При этом результатом такого выражения является значение переменной, которое является результатом условия.
|
|
|
|
14.02.2011, 12:58
|
|
Частый гость
Регистрация: 27.12.2010
Сообщений: 9
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Работать с битами в переменной "С" помогите
Приветствую.
Сообщение от Bill
|
Ерунда какая! Кому как нравится, тот так и пишет. Просто такая запись длиннее, чем
|
А вот это не совсем так.
Наличие или отсутствие разницы в записи СИЛЬНО зависит от аппаратной платформы, конкретного компилятора и наличия/отсутствия оптимизации в нем. На разных процессорах/компиляторах эффективность по размеру или скорости выполнения генерируемого кода, из одного и того же исходника, сильно отличается. Приведу пример - на системах с развитой системой работы с адресацией (например Sparc) правильное использование указателей и адресной арифметики дает колоссальный прирост по производительности, который сильно нивелируется, например, на x86, и уходит в минус на Pic 8 bit. Или эффективность работы со стеком... Поэтому при работе на C в конкретных условиях приходится регулярно смотреть "а что тут у нас получается после компиляции?" и использовать более эффективные приемы.
Поэтому говорить, какая запись "более правильная" (конструкции, выполняющей одно и то же действие) можно только после анализа выхода используемого компилятора. Ну и при смене процессора/компилятора все заново....
Поэтому, чисто переносимый код, все таки несколько проигрывает оптимизированному под конкретный процессор/компилятор. Но оптимизированный код достаточно часто выигрывает у ассемблерного (как это ни смешно). Потому что у ассемблера система команд больше, и запомнить правила оптимизации зачастую сложнее ![Улыбка](images/smilies/icon_smile.gif) Особенно, если в голове ассемблеры от многих процессоров ![Улыбка](images/smilies/icon_smile.gif) (ну например - что выгоднее - сдвиг или умножение... и т.д.).
Так вот, несколько сумбурно...
С уважением,
Михаил
|
|
|
|
14.02.2011, 13:42
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Работать с битами в переменной "С" помогите
Хм... Во-первых, в приведенном примере речь идет только о эквивалентности конечного результата, хотя код может быть различным. Во-вторых, разница в коде может быть заметна, если совсем отключить оптимизацию. Самая элементарная оптимизация сведет разницу на нет. В-третьих, варианты одной и той же записи практически не зависят от конкретной платформы.
Пример:
Код:
|
extern char x, y;
char test1(void)
{
if (!(x & y))
return 0;
return 1;
}
char test2(void)
{
if ((x & y)==0)
return 0;
return 1;
} |
Результат при выключенной оптимизации
Код:
|
1 extern char x, y;
\ In segment CODE, align 2, keep-with-next
2 char test1(void)
\ test1:
3 {
4 if (!(x & y))
\ 00000000 .... LDI R30, `x`
\ 00000002 8100 LD R16, Z
\ 00000004 .... LDI R30, `y`
\ 00000006 8110 LD R17, Z
\ 00000008 2301 AND R16, R17
\ 0000000A 2300 TST R16
\ 0000000C F411 BRNE ??test1_0
5 return 0;
\ 0000000E E000 LDI R16, 0
\ 00000010 9508 RET
6 return 1;
\ ??test1_0:
\ 00000012 E001 LDI R16, 1
\ 00000014 9508 RET
7 }
\ In segment CODE, align 2, keep-with-next
8 char test2(void)
\ test2:
9 {
10 if ((x & y)==0)
\ 00000000 .... LDI R30, `x`
\ 00000002 8100 LD R16, Z
\ 00000004 .... LDI R30, `y`
\ 00000006 8110 LD R17, Z
\ 00000008 2301 AND R16, R17
\ 0000000A 2300 TST R16
\ 0000000C F411 BRNE ??test2_0
11 return 0;
\ 0000000E E000 LDI R16, 0
\ 00000010 9508 RET
12 return 1;
\ ??test2_0:
\ 00000012 E001 LDI R16, 1
\ 00000014 9508 RET
13 }
Maximum stack usage in bytes:
Function CSTACK RSTACK
-------- ------ ------
test1 0 2
test2 0 2
Segment part sizes:
Function/Label Bytes
-------------- -----
test1 22
test2 22 |
Найдите отличия.
Результат трансляции при полностью включенной оптимизации.
Код:
|
1 extern char x, y;
\ In segment CODE, align 2, keep-with-next
2 char test1(void)
\ test1:
3 {
4 if (!(x & y))
\ 00000000 .... LDI R30, `x`
\ 00000002 8100 LD R16, Z
\ 00000004 .... LDI R30, `y`
\ 00000006 8110 LD R17, Z
\ 00000008 2301 AND R16, R17
\ 0000000A F411 BRNE ??test1_0
5 return 0;
\ 0000000C E000 LDI R16, 0
\ 0000000E 9508 RET
6 return 1;
\ ??test1_0:
\ 00000010 E001 LDI R16, 1
\ 00000012 9508 RET
7 }
\ In segment CODE, align 2, keep-with-next
8 char test2(void)
\ test2:
9 {
10 if ((x & y)==0)
\ 00000000 .... LDI R30, `x`
\ 00000002 8100 LD R16, Z
\ 00000004 .... LDI R30, `y`
\ 00000006 8110 LD R17, Z
\ 00000008 2301 AND R16, R17
\ 0000000A F411 BRNE ??test2_0
11 return 0;
\ 0000000C E000 LDI R16, 0
\ 0000000E 9508 RET
12 return 1;
\ ??test2_0:
\ 00000010 E001 LDI R16, 1
\ 00000012 9508 RET
13 }
Maximum stack usage in bytes:
Function CSTACK RSTACK
-------- ------ ------
test1 0 2
test2 0 2
Segment part sizes:
Function/Label Bytes
-------------- -----
test1 20
test2 20 |
Попробуйте найти отличия.
Еще один вариант. Компилятор Cosmic, контроллер stm8. Также найдите отличия.
Код:
|
18 ; 2 char test1(void)
18 ; 3 {
19 scross off
20 0000 _test1:
22 ; 4 if (!(x & y))
23 0000 b600 ld a,_x
24 0002 b500 bcp a,_y
25 0004 2602 jrne L3
26 ; 5 return 0;
27 0006 4f clr a
29 0007 81 ret
30 0008 L3:
31 ; 6 return 1;
32 0008 a601 ld a,#1
34 000a 81 ret
36 ; 8 char test2(void)
36 ; 9 {
37 000b _test2:
39 ; 10 if ((x & y)==0)
40 000b b600 ld a,_x
41 000d b500 bcp a,_y
42 000f 2602 jrne L5
43 ; 11 return 0;
44 0011 4f clr a
46 0012 81 ret
47 0013 L5:
48 ; 12 return 1;
49 0013 a601 ld a,#1
51 0015 81 ret |
Последний раз редактировалось Bill; 14.02.2011 в 13:57.
|
|
|
|
15.02.2011, 08:42
|
|
Прохожий
Регистрация: 06.02.2010
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
|
Re: Работать с битами в переменной "С" помогите
|
|
|
Эти 2 пользователя(ей) сказали Спасибо microsmaster за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:21.
|
|