Với các int ít endian (và giả sử văn bản ASCII và byte 8 bit, và tất cả các giả định khác mà mã yêu cầu) và bỏ qua tất cả các nội dung C sai về mặt kỹ thuật trong mã, "Điều tôi hiểu cho đến nay ”là chính xác.
gets(&n)
sẽ lưu trữ các giá trị ASCII của A, khoảng trắng và B vào 3 byte đầu tiên của n
. Nó cũng sẽ lưu trữ một dấu chấm hết null vào byte thứ 4. Lưu trữ những giá trị ASCII vào những byte n
kết quả trong n
lấy giá trị B*256*256 + space*256 + A
, nơi B
, space
và A
đại diện cho các giá trị ASCII tương ứng.
256 mod 85 là 1, do đó theo các thuộc tính của số học mô-đun,
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
Ngẫu nhiên, với ints big-endian 4 byte, chúng tôi nhận được
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
vì vậy sự bền vững không quan trọng, miễn là chúng ta có ints 4 byte. (Các số nguyên lớn hơn hoặc nhỏ hơn có thể là một vấn đề; ví dụ: với các số nguyên 8 byte, chúng tôi sẽ phải lo lắng về những gì trong số byte n
đó gets
không được đặt.)
Khoảng trắng là ASCII 32 và giá trị ASCII cho một ký tự chữ số là 48 + giá trị của chữ số. Xác định a
và b
như các giá trị số của các chữ số vào (chứ không phải là giá trị ASCII của ký tự chữ số), chúng tôi có
(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
trong đó hai giá trị tương đương cuối cùng dựa vào thực tế a
và b
nhận các giá trị từ 0 đến 9.