В одном из своих разговоров Дуглас Крокфорд говорит, что у него есть некоторые странные свойства, и он идет вперед и объясняет: возможно, есть два целых числа a и b, такие, что a> 0, b> 0.
c = a + b
И мы можем в конечном итоге с ac возможно c <a или b <a. Может ли кто-нибудь объяснить это на примере.
Это скриншот из его разговора.
В c существует сценарий, который может привести к такому поведению. (Например: целочисленное сложение с подписями и т.д.) Подписанное целочисленное переполнение - неопределенное поведение. Оценка выражения вызывает неопределенное поведение, если результат не является представимым значением типа выражения. На многих машинах неопределенного поведение оказывается тот факт, - что получится c
отрицательного (говорить в контексте подписанного дополнения). Это знаковое целочисленное переполнение. Пример должен быть чем-то вроде
int a = INT_MAX;
int b = INT_MAX;
int c = a + b; //<--- overflow.
Копаясь немного дальше, ясно, что при переполнении поведение при переполнении становится максимальным значением в случае javascript. Таким образом, сценарий, который вы показали, скорее всего, не из javascript.
В java, когда он переполняется, он возвращается к минимальному значению и начинает оттуда. Для underflow то же самое происходит, но достигается только максимальное значение, а затем оно идет оттуда.
Это возможно, потому что условие переполнения при операции не обрабатывается должным образом. Скажем, в системе int занимает 2 байта пространства. поэтому поддерживается диапазон -32768 до +32767 или от 0 до 65535
a=65534,b=4;
c=a+b;
c=3.
b=65534,a=4;
c=a+b;
c=3.