Подтвердить что ты не робот

Что такое арифметическое переполнение и переполнение в C?

Что означает среднее арифметическое переполнение и переполнение при программировании на С?

4b9b3361

Ответ 1

Переполнение

Из http://en.wikipedia.org/wiki/Arithmetic_overflow:

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

Итак, например:

uint32_t x = 1UL << 31;
x *= 2;  // Overflow!

Обратите внимание, что, как @R упоминает в комментарии ниже, стандарт C предлагает:

Вычисление, включающее unsigned операнды никогда не могут переливаться, поскольку результат, который не может быть представлен результирующий целочисленный тип без знака равен уменьшено по модулю число, которое является одним больше, чем наибольшее значение, которое могут быть представлены результатом тип.

Конечно, это довольно своеобразное определение "переполнения". Большинство людей будут ссылаться на модульное сокращение (например, на обертку) как "переполнение".

Underflow

Из http://en.wikipedia.org/wiki/Arithmetic_underflow:

условие в компьютерной программе, которая может произойти, когда истинный результат операция с плавающей запятой меньше (то есть ближе к нулю) чем наименьшее значение, представляемое как нормальное число с плавающей запятой в целевой тип данных.

Итак, например:

float x = 1e-30;
x /= 1e20; // Underflow!

Ответ 2

Компьютеры используют только 0 и 1 для представления данных, поэтому диапазон значений, которые могут быть представлены, ограничен. Многие компьютеры используют 32 бита для хранения целых чисел, поэтому наибольшее целое число без знака, которое может быть сохранено в этом случае, равно 2 ^ 32 -1 = 4294967295. Но первый бит используется для представления знака, поэтому на самом деле наибольшее значение 2 ^ 31 - 1 = 2147483647.

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

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

Ответ 3

int, наиболее распространенным типом данных в C является 32-битный тип данных. Это означает, что каждому int присваивается 32 бита в памяти. Если бы у меня была переменная

int a = 2;

который будет фактически представлен в памяти как 32-битное двоичное число: 00000000000000000000000000000010.

Если у вас есть два двоичных числа, например

10000000000000000000000000000000
и
100000000000000000000000000000000000,

их сумма будет равна 100000000000000000000000000000000, что составляет 33 бита. Однако компьютер принимает только 32 младших значащих бита, которые равны 0. В этом случае компьютер распознает, что сумма больше, чем то, что может быть сохранено в 32 битах, и дает ошибку переполнения.

Недостаток - это в основном то же самое, что происходит в противоположном направлении. Стандарт с плавающей запятой, используемый для C, допускает 23 бита после десятичного разряда; если число имеет точность за пределами этой точки, оно не сможет сохранить эти биты. Это приводит к ошибке underflow и/или к потере точности.

Ответ 4

underflow зависит исключительно от данного алгоритма и данных ввода данных, и, следовательно, нет прямого управления программистом. С другой стороны, наоборот, зависит от произвольного выбора программиста для объема памяти, зарезервированного для каждого стек, и этот выбор влияет на количество переполнений времени.