使用小端整数(假设ASCII文本和8位字节,以及代码所需的所有其他假设),并忽略代码中所有在技术上错误的现代C内容,您的"我到目前为止所理解的"是正确的.
gets(&n)
会将A、SPACE和B的ASCII值存储到n
的前3个字节中.它还会在第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字节的大端整数,我们得到
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
所以只要我们有4字节的整数,endianness就不重要了.(更大或更小的整数可能是个问题;例如,对于8字节整数,我们必须担心gets
没有设置的n
字节中有什么.)
空格是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的事实.