Звідки береться номер 92233720368547800 paypal? [зачинено]


36

У новинах з'явилася історія про людину, на рахунок якої в Paypal випадково було зараховано 92,233,720,368,547,800 доларів.

Звідки ця цифра? Яка помилка програмування може призвести до цього числа?


5
Я голосую, щоб закрити це питання поза темою, оскільки це не концептуальна проблема програмування в межах, визначених у довідковому центрі.

Відповіді:


58

Це максимальне значення довгого (64-бітного підписаного інтегрального типу).

від http://msdn.microsoft.com/en-us/library/system.int64.maxvalue.aspx

Значення цієї константи становить 9,223,372,036,854,775,807; тобто шістнадцятковий 0x7FFFFFFFFFFFFFFF.

Це було б максимальне значення для 64-бітного підписаного інтегрального типу на будь-якій мові, я не припускаю, що Paypal використовує .NET, посилання на MSDN вище є лише ілюстративним.

Помилка, ймовірно, є лише поганою помилкою конверсії (наприклад, від десяткової чи плаваючої чи т. Д. До довгої, яка не працює належним чином), що призводить до переповнення значення або поганого дефолтного коду за дивним сценарієм, або це могло бути тестом у виробництві їх інженер / QA команда пішла сіно-дріт. Помилка витоку пам’яті / вказівника пам’яті, перелік способів спричинити це справді незліченно. Могла бути помилка розбору, десериалізуючи деяку інформацію, що надходила до них по всій лінії, надзвичайно численні способи випадкового виявлення несподіваного або нерівного цілісного значення.


1
Ще дивніше те, що ця кількість, очевидно, була округлена до найближчих 100 доларів.
KutuluMike

4
Чому цифри у питанні та відповіді не однакові?
четверггек

3
Тому що ціле значення - це кількість копійок. Отже, ви розділите 2 ^ 63-1 на 100, щоб отримати долари. А потім щось чомусь округлили до найближчих 100 доларів чомусь.
Марк Адлер

4
@th Thursdaysgeek деяка математика пішла досить неправильно, щоб викликати інтегральне переповнення, швидше за все, в процесі отримання коду помилка математики, він продовжував обчислювати деякі операції після того, як переповнення сталося, що призвело до зміни суми ще більше. Як би рівняння було 2 + 3 * 4 * 8/22 + 400 ^ 2, а на другому кроці відбувається переповнення, наступні операції продовжуватимуться застосовувати до цього неправильного числа.
Джиммі Хоффа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.