проблем, если отказаться от беззнаковых в пользу знаковых?
Именно так
теоретически - да. на практике - часто ли ты пишешь программу так, что ты закладываешься на переполнение беззнакового типа?
Каждый день, идентификаторы сообщений/пакетов как пример
Переполнения беззнаковых ничуть не лучше, хотя они формально не UB
Любой счетчик который "хочет" сброситься в ноль при переполнении, что ж тут плохого
Чтобы добиться такого поведения для знакового простого инкремента уже будет не достаточно
идентификатор и должен быть беззнаковым, всё нормально. потому что это не число. это по сути битовая маска.
Ровно до тех пор пока кто-то не заложится на то, что a+b > a
Но ведь аналогично для знаковых, только там еще и уб
формально да, но часто ли такое поведение ожидаемо? что счётчик растёт, а потом бах, падает до нуля?
Ну я же привел пример, генерация сообщений. Идентификатор для очередного сообщения присваивается путем простой инкрементации счетчика
ну да, о том и речь, что пример не показателен
на самом деле пора признать, что там вполне определенное поведение при Two's complement. железо где не так еще существует?
окей, хороший пример. здесь реально подходит беззнаковый тип. но ещё раз повторю - идентификатор - не число. это битовая маска. например, обычно нет смысла вычитать идентификаторы друг из друга, или прибавлять к ним другие числа. они не должны участвовать в арифметике. по хорошему их даже на больше/меньше не следует сравнивать, только на равно. так что для них беззнаковый - отличный выбор
Может и так, но стандарт...
нет, компилятор может эксплуатировать факт того, что это UB. и он это часто делает
Обсуждают сегодня