З мало-ендіанськими ints (і припускаючи текст ASCII, і 8-бітові байти, і всі інші припущення, які вимагає код), і ігноруючи всі технічно помилкові в сучасному-C речі в коді, ваш "Що я розумію поки що "правильно.
gets(&n)
буде зберігати значення ASCII A, пробілу та B у перші 3 байти n
. Він також збереже нульовий термінатор у 4-му байті. Збереження цих ASCII значення в ці байти n
результатів в n
приймаючому значення B*256*256 + space*256 + A
, де B
, space
і A
представляють відповідні значення ASCII.
256 мод 85 дорівнює 1, тому за властивостями модульної арифметики,
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
До речі, ми отримуємо 4-байтові великі ендіанські інти
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
тому ендіанність не має значення, якщо у нас є 4-байтові вставки. (Більші чи менші ints можуть бути проблемою; наприклад, з 8-байтовими ints нам доведеться турбуватися про те, що в байтах n
цього gets
не встановлено.)
Пробіл - ASCII 32, а значення ASCII для символу цифри - 48 + значення цифри. Визначаючи a
і b
як числові значення введених цифр (а не значення ASCII символів цифр), ми маємо
(B + space + A) % 85 = (b + 48 + 32 + a + 48) % 85
= (a + b + 128) % 85
= (a + b + 43) % 85
(B + space + A) % 85 - 43 = (a + b + 43) % 85 - 43
= (a + b) % 85
= a + b
де дві останні еквівалентності покладаються на той факт, що a
і b
приймають значення від 0 до 9.