Каковы арифметические потери и переполнения в C? - PullRequest
19 голосов
/ 15 июня 2011

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

Ответы [ 4 ]

29 голосов
/ 15 июня 2011

Перелив

С http://en.wikipedia.org/wiki/Arithmetic_overflow:

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

Так, например:

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

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

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

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

Underflow

С http://en.wikipedia.org/wiki/Arithmetic_underflow:

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

Так, например:

float x = 1e-30;
x /= 1e20; // Underflow!
7 голосов
/ 13 января 2014

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

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

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

0 голосов
/ 26 октября 2014
Недостаточное значение

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

0 голосов
/ 15 июня 2011

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

int a = 2;

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

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

10000000000000000000000000000000
и
10000000000000000000000000000000,

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

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

...