Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
10.12.2009, 18:47
|
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
С арифмметика. Запутался приведениях типов
Доброго.
Есть макрос, который генерит значение байта для 7-сегментного индикатора.
Код:
|
// Это уже результат его работы
buf = ((~((0‹‹0)|(0‹‹1)|(0‹‹2)|(0‹‹3)|(0‹‹4)|(0‹‹5)|(1‹‹6)|(0‹‹7)))); |
Пока всё работает отлично.
Теперь мне нужно 4 таких байта запихнуть в "видеопамять" unsigned long
В голове выстраивается примерно такое:
Код:
|
#define screen_code(a,b,c,d) ((a‹‹24)+(b‹‹16)+(c‹‹8)+d) |
И тут начинается капут. "out of range"
Доупрощал до такого куска и туплю ... как компилятор заставить собрать правильно четыре байта в длинное целое?
Код:
|
//ZG7_minus дает строку с примера выше (buf)
// ТУТ ВСЁ РАБОТАЕТ
#define screen_code(a,b,c,d) ((a‹‹24)|(b‹‹16)|(c‹‹8)|d)
#define SCREEN_MINUS screen_code(255,255,255,255)
//ТУТ ПОЛУЧИЛОСЬ ЗАСТАВИТЬ РАБОТАТЬ С ПРИВЕДЕНИЕМ ТИПА
#define screen_code(a,b,c,d) ((a‹‹24)|(b‹‹16)|(c‹‹8)|(unsigned char)d)
#define SCREEN_MINUS screen_code(255,255,255,ZG7_minus)
//А ТУТ УЖЕ НЕТ - переполнение и полный бред
#define screen_code(a,b,c,d) ((a‹‹24)|(b‹‹16)|(c‹‹8)|(unsigned char)d)
#define SCREEN_MINUS screen_code(255,255,ZG7_minus,ZG7_minus) |
|
|
|
|
10.12.2009, 18:59
|
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Re: С арифмметика. Запутался приведениях типов
Научный тык показал, что при отключении инвентирования (убрать ~ в начале макроса) всё начинает работать. Как же быть!?
|
|
|
|
10.12.2009, 19:19
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: С арифмметика. Запутался приведениях типов
|
|
|
|
10.12.2009, 21:56
|
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Re: С арифмметика. Запутался приведениях типов
Ответ находится в приложении "преобразования типов" у К&R.
((~((0‹‹0)|(0‹‹1)|(0‹‹2)|(0‹‹3)|(0‹‹4)|(0‹‹5)|(1‹‹ 6)|(0‹‹7))))
Если убрать "~", то всё начинает работать, ибо тип результата будет char, который благополучно потом сдвигается на свое место.
При добавлении "~", результат этой строки расширяется до unsigned long и мы получаем проблему при сдвиге.
Но почему происходит расширение типа?! Ведь операнд у ~ один и не длинное целое.
Принудительное приведение типа решило проблему:
//Макрос "сборки" байта знакогенератора из определдений "бит-сегмент" и "полярность поджига" (1/0-зажечь/потушить).
#define ZG7_compile(xA,xB,xC,xD,xE,xF,xG,xP) ((unsigned char)(ZG7_inv((unsigned char)((xA‹‹ZG7_A)|(xB‹‹ZG7_B)|(xC‹‹ZG7_C)|(xD‹‹ZG7_D)|( xE‹‹ZG7_E)|(xF‹‹ZG7_F)|(xG‹‹ZG7_G)|(xP‹‹ZG7_P)))))
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:24.
|
|