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

Ругается не на цикл, а за выход за рамки ?

Давай вот без этих глупостей? Нет никакого “компилятора Ардуины”. Посмотри на то, чем ты пользуешься! Это самый стандартный GCC, который фактически основной компилятор на планете Земля и не только языка Си.
И да, “ракеты в космос” запускаются почти наверняка с использованием того же самого GCC. Это успокаивает тебя? Надеюсь! :wink:

Я не знаю архитектуру микроконтроллера Ардуино, но улавливаю, что получается неявное и никем не контролируемое изменение типа данных, которое приводит к таким чудесам. Не говорите пожалуйста что “это не ошибка, так и задумано”. Если все значения по факту хранятся в какой-то там четырехрегистровой среде, так зачем этот цирк с эмуляцией двухбайтовых типов данных?! Скажите “у нас по умолчанию все данные занимают четыре байта, поэтому не парьтесь и всегда используйте четыре байта под хранение данных”. Но только правда при этом неважно сколько байт отводится под хранение данных - важно правильно обрабатывать их во всём диапазоне значений.

Говорят же вам пишите условие правильно - 0…32767 = все положительные и 0 … >=0
Ваша упертость - очень похожа на глупость !

Мне кажется вы выборочно как-то читаете мой текст. Не люблю так, но вынужден ответить вопросом на вопрос - неравенства “i < 32768” и “i <= 32767” математически идентичны?

нет такого числа для двухбайтового INT и компилятор вам об этом сообщил !

Нет никакой “архитектуры Ардуино”! Ардуино - это концепция общей библиотеки Wiring, для программирования многих РАЗНЫХ контроллеров на языке С++.
На вскидку используются архитектуры:

  • AVR - всякие Уно/Нано и пр… 8 разряная
  • ARM - Дуе, Распберри Пико, СТМ… 32 разрядная
  • Xtensa - ЕСП8266, ЕСП32… 32 разрядная

коллеги добавят

Ага… Значит вот тут он проконтролировал соблюдение границ типов данных? Почему тогда у меня получилось в переменной получить значение 1,5 млн?

У него хватает мозгов увидеть, что число в условии превышает размерность int, т.е. тут автор однозначно допустил ошибку

А вот неопределенности компилятор рассматривает под углом “автору виднее, что ему надо”. До вас не доходит, что это условие ВСЕГДА будет истинным? Следите за пальцами

32767 + 1 == - 32768;
-32768 <= 32767;

Логично? Еще как. Ну и в каком случае ваш цикл сможет завершиться?

Компилятор вам почти по человечески сказал, что int i = 32768 - это из области фантастики

Вот вынужден согласиться

ну вы же попросили у компилятора СТРАННОЕ - вот он вам и выдал СТРАННОЕ !

Я отучился в МГУ им Ломоносова, на МехМате, отделение мат. логики в 86-91 годах. Тебя мой ответ устроит? Диплом - не “красный” уж прости!
НЕТ. Это разные утверждения в кольце вычетов по 2 в 15 степени. В этом кольце число 32768 не существует.

Я, к сожалению, закончил только восемь классов ещё советской школы (когда было 8 и 10). Меня в школе научили, что это равнозначные неравенства. Поэтому сейчас я ловлю клина от мысли о том, что должен трактовать это как два неравнозначных неравенства.

Ладно, не будем спорить… В конце концов, в чужой монастырь со своим уставом не ходят. Наверное, тут другой мир с другой атмосферой. Особенности работы с флагом переполнения я понял, особенностей как двухбайтовая переменная вдруг смогла хранить значение не в 64, а в 1,5 млн - не понял. Уж простите. Дело то ведь не во мне… Когда на грабли наступает 1 человек - это его проблема. Когда толпа - встаёт вопрос “а какой м…ак сюда эти грабли положил?”. Если я единичный случай, так и бог с ним. Если каждый новичок в Ардуино приходящий, будет на них наступать, это будет уже другой вопрос.

Старший бит - это бит ЗНАКА, а не бит ПЕРЕПОЛНЕНИЯ !

Должен знать язык на котором программируете. Вы его не знаете, в этом Ваша проблема. Именно Ваша, а не языка и не компилятора.

Именно в Вас!

где вы толпу увидели? оглянитесь, вы тут такой один.
Я больше всех раскопал о вашем, так называемом, баге.
Но внимательнее прочитайте мой вывод - если вы изначально пишете неверный код, то нечего на компилятор кивать, когда он выполняет его не так, как вы ожидали.

Нет смысла задумыватся, почему “неопределенное поведение” пошло по тому пути, а не иначе. Оно потому и “неопределенное”, что зависит от всего - от версии компилятора, от модели процессора, от погоды на Ямале, в конце концов.
Не надо задаваться ИДИОТСКИМ вопросом, почему компилятор сработал так. Важнее разобраться в другом - как писать. чтобы этого не было.

Изучайте С++, чтобы не попадать в такие ловушки.

Я знаю. Но для типа int, у которого старший бит является ЗНАКОВЫМ, для хранения ЧИСЛА остается только 7 бит. И в этом случае когда я выполняю действие:
1111111+
0000001=
0000000

возникающая при переполнении 1 переносится не в 8-й бит, хранящий ЗНАК, а во флаг переполнения CF. И уже взведенный флаг CF кричит о том, что произошел выход за границы допустимых значений типа данных. Именно так и должны контролироваться, по моим представлениям, границы диапазона ABS(0…127).

Я уже понял, что в Ардуино это не так…

Ардуино не пишет своих компиляторов. В Ардуино Нано используется gcc(если вам это о чем-то говорит).
Если нет - я поясню, gcc это самый распространенный компилятор С++ на планете на данный момент. Он используется миллионами программистов в миллионах устройств, не только в ардуино.
Ардуино и компилятор в вашей проблеме не виноваты. Просто каждый инструмент надо использовать по назначению. Если вы отрубите топором голову соседу - судить будут не топор.

1 лайк

ну будьте вы поумнее, остановитесь.
или он так и будет отвечать на каждое ваше сообщение.

2 лайка

Озвучьте конкретную платформу - проверим что там и как со старшим битом …

Да ладно, действительно пора заканчивать. Решим, что виновата моя голова.