使用小尾数整数(并假设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字节big-endian int,我们得到
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
因此字节序无关紧要,只要我们有4个字节的整数即可。(更大或更小整数可能是一个问题;例如,具有8个字节的整数,我们不得不对什么是在字节的担心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。