リトルエンディアンのint(およびASCIIテキスト、8ビットバイト、およびコードが必要とする他のすべての仮定)を使用し、コード内の技術的に間違った現代のCのものをすべて無視すると、「私が理解していることこれまでのところ」は正しいです。
gets(&n)
A、スペース、およびBのASCII値をの最初の3バイトに格納しますn
。また、ヌルターミネータを4番目のバイトに格納します。それらのバイトにそれらのASCII値を格納するn
に結果n
値をとるB*256*256 + space*256 + A
場合、B
、space
、及びA
対応するASCII値を表します。
256 mod 85は1なので、モジュラー演算のプロパティにより、
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
ちなみに、4バイトのビッグエンディアンintを使用すると、
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
したがって、4バイトのintがある限り、エンディアンは重要ではありません。(intが大きいか小さいかが問題になる可能性があります。たとえば、8バイトのintの場合、そのバイトに何が設定されn
てgets
いないかを心配する必要があります。)
スペースはASCII32であり、数字のASCII値は48+数字の値です。入力された数字の数値として(数字のASCII値ではなく)を定義するa
と、次のb
ようになります。
(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
ここで、最後の2つの同等性は、a
とb
が0から9までの値を取るという事実に依存しています。