> О боже...
> integer overflow это не UB. Это прямое следствие лежащего под софтом железаВообще-то для именно signed int - таки UB. Хотя-бы потому что ... формат хранения signed int не специфицирован жестко и возможно несколько разных вариантов.
Что случится при wrap - "implementation defined" и зависит от формата хранения int. Полагаться на это нельзя. Хотя в C23, чтоли и где-то рядом в C++ оставили только один вариант, там еще есть какие-то шансы на defined.
Unsigned в этом лучше: там wrap явно прописан и это, таки, defined behavior.
Ах да, "int" - весьма растяжимое понятие. Ну вот например int 16 битов размером вполне валиден по стандартам. На некоторых платформах, типа ардуины, это даже можно и активировать, если горя хлебнуть хочется. Реально конечно большая часть софта дико лажанет если так сделать.
> и того, что Си не заявляет каких-то немыслимых абстракций. По такой
> логике, ошибки округления чисел с плавающей запятой в любом ЯП это UB.
У плавучки свои грабли. А в сях таки более чем достаточно UB - вплоть до того что если вы в 16-бит "int" загнали 65535 - то вообще ктулху его знает чему это будет на самом деле равно, с учетом сочетания факторов "формат хранения int" и "16 битное int".
...одна из причин по которым в C99 таки сделали более нормальные типы. К сожалению ума завершить что начали у комитета импотентов не хватило. Так что препроцессор оперирует чем-то другим, более близким к обычным типам. А считать он таки - может. Или например enum - да вообще удачи угадать какой у него эффективный тип. Он так специфицирован, что...
...и кстати если что-то typedef'нуть как enum и потом указать вот именно аргументом, имнено такой тип - компилеру класть что на вход дают значения котрых в этом enum и его typedef отродясь не было. И пользы от такого enum - сильно меньше чем могло бы быть. В плане зарубания багов.
Мораль сей басни такова: если ты юзаешь си - изволь почитать стандарты а также гайдлайны по antibug приемам. Иначе код у тебя будет, как бы это сказать...