int, наиболее распространенный тип данных в C, является 32-битным типом данных. Это означает, что каждому int дается 32 бита в памяти. Если бы у меня была переменная
int a = 2;
, который фактически будет представлен в памяти как 32-разрядное двоичное число:
00000000000000000000000000000010.
Если у вас есть два двоичных числа, например
10000000000000000000000000000000
и
10000000000000000000000000000000,
их сумма будет 100000000000000000000000000000000, что составляет 33 бита. Однако компьютер принимает только 32 младших значащих бита, которые равны 0. В этом случае компьютер распознает, что сумма больше, чем то, что может быть сохранено в 32 битах, и выдает ошибку переполнения.
Подполнение - это в основном то же самое, что происходит в противоположном направлении. Стандарт с плавающей точкой, используемый для C, допускает 23 бита после десятичного разряда; если число имеет точность выше этой точки, оно не сможет сохранить эти биты. Это приводит к ошибке недостаточного значения и / или потере точности.