volatile char i, L1, L2, line_2, line_1; volatile int T1; volatile int period;
Воооот, так вот T1 и period у меня почему-то от -32767 до 32767, а должон быть от 0 до 65535. Кто сталкивался? Я 3 часа убил чтоб найти почему у меня не работает прога.
_________________ Вот до чего же было классно в "Медали За Отвагу" - бросаешь гранату в немецкий патруль с собакой... Немцы разбегаются, а собака хватает гранату и отностит хозяину....
_________________ Вот до чего же было классно в "Медали За Отвагу" - бросаешь гранату в немецкий патруль с собакой... Немцы разбегаются, а собака хватает гранату и отностит хозяину....
А как вы узнали, что ваша переменная определилась как знаковая? Ваш компилятор выдает предупреждение при занесении в переменную значения большего чем 32768?
Самый простой способ проверить - сравнением значения переменной с константой:
unsigned int vrem = 33000;
if( vrem > 32999 ) { // тут зажигаем диодик }
Если условие выполнится, значит переменная точно имеет беззнаковый тип.
Ну, или, чуть более сложный, но надежный способ - почитать ассемблерный код вашей программы и проверить какое именно значение константы заносится в память.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
корявый перевод документации: Модификаторы signed и unsigned может быть применен как char и int . В отсутствие unsigned префикс, signed автоматически предполагается, для целых типов. Единственным исключением является char , который unsigned по умолчанию. Ключевые слова signed и unsigned , если они используются сами по себе, означает signed int и unsigned int соответственно. http://www.mikroe.com/download/eng/docu ... _types.htm Неправильное использование беззнаковых целых может приводить к неочевидным ошибкам из-за возникающего переполнения. В приведённом ниже примере использование беззнаковых целых в цикле в C и C++ превращает этот цикл в бесконечный:
Код:
char ar[N]; for (unsigned int i = N-1; i >= 0; --i) ar[i] = i;
Более менее ясно,а как тут быть? long vrem; char i = 2;
vrem = 65535*i;
Переменная vrem не становится равной 131070,но написав vrem=65535*2 тогда становится. Вот как это понимать?
_________________ Вот до чего же было классно в "Медали За Отвагу" - бросаешь гранату в немецкий патруль с собакой... Немцы разбегаются, а собака хватает гранату и отностит хозяину....
это понимать так: срочно скачивайте книжку по языку Си и читайте ее внимательно до полного просветления!
65535*i - здесь 65535 - это unsigned int, а i - char. по правилам Си оба операнда должны быть одного типа, причем наибольшего из них (а еще интересно, что два char всегда приводится к двум int). то есть i приводится к unsigned int. по тем же правилам результат будет равен типу операнда, т.е. unsigned int. в таком типе не может помещаться больше, чем 65535.
65535*2 - это произведение констант. такие произведения вычисляются препроцессором ДО начала компиляции. при вычислениях скорее всего используется разрядность компьютерных Int-ов, поэтому получается константа 131070, которая уже законно имеет тип long и отлично помещается в переменную.
чтобы не было проблем с вычислениями вроде вашего 65535*i, используйте принудительное указание типа операнда больше, чем вам надо, например так: 65535 * (long)i. в этом случае переменная i вашими усилиями превратится в long, а потом 65535 тоже превратится в long, а потом произведение их тоже будет long, все в строгом соответствии с правилами Си.
но проще указать тип константы при помощи суффикса UL: 65535UL * i - в этом случае все будет то же самое, т.к. UL обозначает unsigned long
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Я догадывался, но вы расставили точки над i. Спасибо вам огромное. Век живи,век учись
_________________ Вот до чего же было классно в "Медали За Отвагу" - бросаешь гранату в немецкий патруль с собакой... Немцы разбегаются, а собака хватает гранату и отностит хозяину....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения