Что за цирк с типом данных int?

интересно девки пляшут, когда ждать пост об этом?

у него нет координаты, он сразу везде

А надо?

мне да, про других - не знаю

Да, там ничего особенного. Просто решил собрать в кучу разрозненные куски по ADC для всех avr-ок, что у меня сейчас есть (а это 328-ая, 85-ая тинька, 2561 и 32А (есть ещё AT90S8515, но у неё нет ADC)) и сделать что-то вроде adc-библиотеки, которая полностью использует всё, что есть в ADC для всех этих контроллеров, чтобы не рыться каждый раз по старым проектам в поисках подходящих кусков кода. Биполярный режим есть у всех, кроме 328-ой, но в 2561 и 32А с ним всё просто - он постоянно включён, а в 85-ой можно включать и выключать и вот там у меня что-то не клеится, когда одновременно включаю биполярный режим и начинаю изменять полярность униполярного.

Ну, ладно, как закончу, выложу чё-нить.

Ладно, сажусь писать про “баг”.

Это Вы вот про это?

Ну что, уважаемый Евгений Петрович, у кого из нас двоих баг? У меня в голове, или у вас в системе? Вы уж меня простите пожалуйста. Мне от рождения качество такое досталось - если где-то что-то сделано хреново, то именно мне суждено явить человечеству этот баг. Вот он спал у вас в системе благополучно 23 года. И, к сожалению, именно мне довелось его явить вам на тарелочке с голубой каёмочкой…

У Вас в голове.

Не пробовали сдать анализ на уровень бронзы? А то на вид у Вас бронзовелость выше, чем у одесского Дюка :slight_smile:

Уважаемый, хоть у нас с ЕвгениемП очень разные взгляды на некоторые места из Божественного Августина, но тут я просто должен встать на сторону истины.

Дело в том, что никакой компилятор НЕ МОЖЕТ гарантировать предсказуемую работу ОШИБОЧНОГО кода.
Код содержит ошибочное условие цикла. которое всегда истинно. Следовательно, без дополнительного указания программиста в декларациях или атрибутах, компилятор преобразует код по своему усмотрению. Если это “усмотрение” не соответствует парадигме автора, то это касается исключительно ошибочной парадигмы автора. Is it clear?

Страуструпу надо яица прибить на Красной площади.

Я вот прочитал то, что удалось обнаружить коллегам, и у меня волосы встали дыбом во всех местах. Как же вообще народ программирует на Ардуино, если тут такие косяки в платформе?! Какая разница, где объявлена переменная - глобально или локально?! Она везде должна работать ЖЕЛЕЗОБЕТОННО так, как я себе это представляю. Я, как прикладной программист, не должен думать о том, что и как приспичить счудить компилятору. Никаких скрытых трансформаций из int в long быть не должно. Если я захочу трансформировать тип данных, то это должно происходить исключительно по моему желанию. Если я сказал, что переменная должна быть целочисленного типа длиной в 2 байта, значит она такой и должна оставаться. Везде, всегда. При любом поведении.

Вспоминая ассемблер для процессоров Intel, который я изучал 20 лет назад, я скажу, что если в регистре процессора AL хранится 1 байт со значением 0xFF, то даже если я растяну регистр до RAX, у меня значение всё равно там будет 0x000000FF. И уж точно, когда возникает ситуация, при которой значение переменной совершенно спокойно вылетает за границы её разрядности, нельзя считать “так задумано, это не баг”. Это баг. Самый настоящий баг.

Ок, продолжайте в том же духе. Хорошо что наши ядерные ракеты не находятся под управлением Ардуино. А то с вашим “это не баг, так задумано” человечество уже давно бы распрощалось с жизнью. В т.ч. с вашей…

Да что же ошибочного в моём праве попытаться использовать весь диапазон значений, разрешенных в int? Или вы хотите сказать, что для типа int можно использовать все значения, кроме последнего 32767, для однобайтового можно использовать все значения, кроме 255 (и т.д. для всех остальных типов данных). Что ошибочного в моем условии i <= 32767?! Ошибка не у меня, а у вас в Ардуино, потому что компилятор не понимает, что у него взводится флаг CF (это из Интела, я не знаю есть ли аналогичный флаг у Ардуины). А ведь именно взведенный флаг CF и показывает, что следующая итерация приводит к невыполнению условия! И раз компилятор пропускает это переполнение и никак не обрабатывает его, то эта ошибка приводит к возникновению всех последующих ошибок (например, цикл становится бесконечным).

Дорогой! Ты не понял сути. Это “так не задумано”. Ты пишешь, что имеешь опыт программирования? Пусть, не стану обсуждать, как такое возможно без знания основного языка - то есть С. Пусть.

Ты поручил компилятору собрать и ОПТИМИЗИРОВАТЬ по времени выполнения ошибочный код.
Ты удивлен тому, что в результате есть не написанные тобой странности поведения.
Поясни логику твоих слов?
По твоему компилятор должен был твою ошибку найти? Ну да, с учетом развития ЧатГПТ, скоро так и станет. Вероятно. Я надеюсь.

Просто то, что это НЕВОЗМОЖНО сделать таким способом. Это конструкция для языка не верна.
Потому. что (32767 + 1) <= 32767 это медицинский факт. Если это не соответствует твое парадигме, повторю - проблема не в С, а в твоей парадигме.

Нет тут никакого переполнения ! Есть смена знака числа - тогда так пишите i>=0 и всё будет как вы хотите или я выше давал вариант с do while …

Ага… Значит когда я пишу условие i < 32768, у компилятора хватает мозгов понять, что цикл будет бесконечным, и он отказывается компилировать такой код. А когда я пишу i <= 32767, то нет?! Математику покажите эти два неравенства, и попробуйте доказать, что они разные.

Но вообще я готов простить компилятору Ардуины эту, наверное, мелочь. Я не понимаю как происходить неконтролируемое переполнение двухбайтовой переменной i, которая внезапно позволяет сохранять в себе значения, выходящие за рамки её разрядности. Друзья, у меня в заголовке темы были слова “счетчик переменной i благополучно доходит до порога 32767, проскакивает дальше, и летит в космос”. На скриншоте приведены значения в 1,5 млн, которые ну никак не должны в теории укладываться в 64к. Я обязан получать не такой результат, как вижу. И хоть тресни, но таких дыр, когда ты объявляешь переменную в два байта, а она у тебя странным образом становится трехбайтовой, быть не должно. Иначе я не могу верить платформе и её языку программирования. Столь уважаемый в сообществе (раз по имени-отчеству величают) Евгений Петрович упорно старается не замечать эту часть моего вопроса, и отмазывается словами “это не ошибка, так задумано”. А на мой взгляд - это чистейшей воды баг.

Не ругается компилятор то ?

Ругается

Она становится 4ех регистровой !