Странные свойства int

1

В одном из своих разговоров Дуглас Крокфорд говорит, что у него есть некоторые странные свойства, и он идет вперед и объясняет: возможно, есть два целых числа a и b, такие, что a> 0, b> 0.

c = a + b

И мы можем в конечном итоге с ac возможно c <a или b <a. Может ли кто-нибудь объяснить это на примере.

Это скриншот из его разговора. Изображение 174551

  • 2
    Нет в JavaScript, нет. (Так как в JS все равно нет целых чисел). Можете ли вы указать на разговор, где он сказал это, чтобы дать некоторый контекст?
  • 0
    Это будет верно только в том случае, если добавление приведет к переполнению, но я сильно сомневаюсь в этом в случае Javascript.
Показать ещё 3 комментария
Теги:

2 ответа

2

В существует сценарий, который может привести к такому поведению. (Например: целочисленное сложение с подписями и т.д.) Подписанное целочисленное переполнение - неопределенное поведение. Оценка выражения вызывает неопределенное поведение, если результат не является представимым значением типа выражения. На многих машинах неопределенного поведение оказывается тот факт, - что получится c отрицательного (говорить в контексте подписанного дополнения). Это знаковое целочисленное переполнение. Пример должен быть чем-то вроде

int a = INT_MAX;
int b = INT_MAX;
int c = a + b; //<--- overflow.

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

В , когда он переполняется, он возвращается к минимальному значению и начинает оттуда. Для underflow то же самое происходит, но достигается только максимальное значение, а затем оно идет оттуда.

1

Это возможно, потому что условие переполнения при операции не обрабатывается должным образом. Скажем, в системе int занимает 2 байта пространства. поэтому поддерживается диапазон -32768 до +32767 или от 0 до 65535

a=65534,b=4; 
c=a+b;
c=3.

b=65534,a=4; 
c=a+b;
c=3.
  • 1
    Было бы точнее сказать, что целые числа компьютеров не могут точно моделировать математику, когда они переполнены, или иным образом распределить это по фазе. Является ли обработка «правильной» или нет, является оценочным суждением - если поведение работает для конкретного приложения, даже для большинства приложений, и используется надлежащим образом, и является быстрым, экономичным решением, тогда оно является правильным. Это инструмент, который послужил своей цели. Тот факт, что он имеет пределы, не делает его плохим; все инструменты имеют ограничения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню