На самом деле, для C есть варианты проверки, смотрите здесь: http://danluu.com/integer-overflow/
Как для Java, добавив целочисленное переполнение проверки откроет банку с червями. Поскольку java не предлагает неподписанные типы, математика без знака часто выполняется в простых int или long-типах - очевидно, что VM не будет волшебно знать о неподписанном характере предполагаемой операции, то есть вам нужно либо добавить неподписанные типы, либо программисту уделять большое внимание включению и выключению чеков. Пример для unsigned math с подписанными типами можно найти в Arrays.binarySearch. На стороне примечание, Java точно определяет, что результат в случае переполнения, поэтому полагаться на поведение переполнения является законным использованием определенного поведения.
Как кратко проанализировано в ссылке C выше, эти проверки могут оказать серьезное влияние на производительность на практике из-за сочетания грубой реализации и/или вмешательства в другие оптимизации кода.
Кроме того, в то время как большинство ЦП могут обнаружить переполнение (как правило, с помощью флагов C и V), они делают это одновременно для подписанных/неподписанных (общие ЦП ISA не делают различий между подписанными/неподписанными операциями в случае добавления /). Его программа реагирует на эти флаги, что означает вставку дополнительных инструкций в код. Опять же, это означает, что программист/компилятор должен знать, должна ли операция быть подписана или без знака, чтобы сделать правильный выбор.
Таким образом, обнаружение переполнения имеет стоимость, хотя оно может быть сделано достаточно маленьким с хорошей поддержкой компилятора.
Но во многих случаях переполнение невозможно по дизайну (например, допустимые входные параметры функции не могут вызвать переполнение), желаемые (например, обтекание счетчиков поведения) или когда они происходят, пойманы другими способами, когда результат используется (например, с помощью проверки границ массива).
Мне нужно много думать о тех случаях, когда я действительно ощущал необходимость проверки переполнения. Обычно вам гораздо больше нравится проверять диапазон значений в определенных точках (например, аргументы функции). Но это произвольные проверки для диапазона specfic значений функций, которые компилятор даже не знает (ну, на некоторых языках он будет, потому что он явно выражен, но ни Java, ни C не попадают в эту категорию).
Так что проверка переполнения не является универсальной. Это не означает, что нет никаких потенциальных ошибок, которые он мог бы предотвратить, но по сравнению с другими переполнениями типов ошибок переполнение не является обычной проблемой. Я не могу вспомнить, когда я в последний раз видел ошибку, вызванную переполнением целых чисел. Например, одни ошибки чаще встречаются. С другой стороны, существуют некоторые микрооптимизации, которые явно полагаются на переполнение (например, старый вопрос), см. Принятый ответ: Performance: float to int cast and clipping result to range).
В ситуации, описанной выше, принуждение C/Java проверять и реагировать на переполнение целых чисел сделает их хуже языков. Они будут медленнее, и/или программист просто деактивирует эту функцию, потому что она мешает больше, чем полезно. Это не означает, что проверка переполнения в качестве языковой функции обычно была бы плохой; но для того, чтобы действительно получить что-то из этого, окружающая среда также должна соответствовать (например, как упомянуто выше, Java будет нуждаться в неподписанных типах).
TL; DR Это может быть полезно, но для этого требуется гораздо более глубокая поддержка языка, чем просто переключатель, который будет полезен.
Во-первых, переполнение буфера и арифметическое переполнение - это две совершенно разные вещи. Один аргумент для того, чтобы не проверять * каждую операцию *, - это было бы очень дорогостоящим, но во многих случаях совершенно ненужным (например, если операция не может переполняться из-за предусловий). – NPE
В C операции, которые приводят к переполнению/недогрузке, во многих случаях имеют неопределенное поведение. Что, между прочим, означает, что компилятор не обязан проверять операции. Проверка каждой операции - особенно во время выполнения - приведет к поражению производительности. И разработчик обычно имеет больше информации (например, понимание общего алгоритма), поэтому лучше всего решать, какие операции являются критическими. Теоретически по крайней мере ..... слишком многие разработчики вообще не думают о таких вещах. – Peter