Mit Little-Endian-Ints (und unter der Annahme von ASCII-Text und 8-Bit-Bytes und allen anderen Annahmen, die der Code erfordert) und dem Ignorieren aller technisch falschen modernen C-Inhalte im Code ist Ihr "Was ich verstehe soweit "ist richtig.
gets(&n)
speichert die ASCII-Werte von A, Leerzeichen und B in den ersten 3 Bytes von n
. Es wird auch ein Null-Terminator im 4. Byte gespeichert. Speichern von ASCII jene Werte in diese Bytes n
Ergebnisse in n
den Wert nehmen B*256*256 + space*256 + A
, wo B
, space
und A
stellen die entsprechenden ASCII - Werten.
256 mod 85 ist 1, also durch die Eigenschaften der modularen Arithmetik,
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
Übrigens bekommen wir mit 4-Byte-Big-Endian-Ints
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
Endianness spielt also keine Rolle, solange wir 4-Byte-Ints haben. (Größere oder kleinere Ints könnten ein Problem sein. Bei 8-Byte-Ints müssten wir uns beispielsweise Gedanken darüber machen, was in den Bytes enthalten ist n
, gets
die nicht festgelegt wurden.)
Das Leerzeichen ist ASCII 32 und der ASCII-Wert für ein Ziffernzeichen ist 48 + der Wert der Ziffer. Definieren a
und b
als numerische Werte der eingegebenen Ziffern (anstelle der ASCII-Werte der Ziffernzeichen) haben wir
(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
wobei die letzten beiden Äquivalenzen auf der Tatsache beruhen, dass a
und b
Werte von 0 bis 9 annehmen.