我在学校有一项任务,我必须回答这个问题:
“有几个学生制作了一个日历程序,其中”绝对日数“定义为从1月1日0到当天的天数。在许多小型计算机上,Int的最大值是32767。如果我们忽视这一点会发生什么?你怎么解决这个问题?“
这个问题让我很困惑。我目前使用Python工作,从我读过的Python中,Python通过将Int转换为Long来自动处理Int溢出,而其他编程语言也做类似的事情(比如回绕到负数,AKA 32768变成-32767)。如果编程语言没有自动处理溢出,我会想象如果数字超过32767,你只会得到一个错误......对吗?
如果你想打印“绝对日期数”(假设它超过32767并且你只能使用Int)你将无法,因为你不能将值存储在Int中。这是不可能的。如果您只想打印今天的日期,您可以从PC BIOS中取出它或使用Unix时间。
对我而言,这个问题的答案似乎取决于你希望程序做什么。但我的老师说没有。他说我的答案都不正确。我并不完全明白他想要什么样的答案,这应该是一个简单的问题,因为我现在只做了大约2个月的编程。我错过了什么是如此明显?我是否想过这个?
答案 0 :(得分:0)
CPU在所有条件下都没有检测到无效结果,因此您必须自己检查。然后你仍然有问题,数学没有工作,你不能做你想要的计算。另一种解决方案是将数据存储在更大的数据结构中,并在结构上实现自己的加/减/ ...运算。
python的作用是什么,以及为什么它可以本地存储不确定的大整数。查看python的decimal
模块以获取另一个示例。有C / C ++的库,我也推测其他语言。您也可以自己实现一个API - 它有点乏味但可行。
答案 1 :(得分:0)
这与语言无关,因为正如您所观察到的,有些语言可以处理整数溢出。
它与RAM无关。
它与当代CPU架构和整数数字的工作方式有关。简而言之,CPU只能处理称为“字”的特定数量的位。通常,处理整数的CPU部分中的寄存器可以包含一个字。在您的示例中,单词大小为16。
也就是说,我们可以存储的最大数字(二进制)是:
1111 1111 1111 1111
那么,当我们加1时会发生什么?
1111 1111 1111 1111
+0000 0000 0000 0001
1 + 1井是10(二进制),所以我们在最后一个位置得到0,但必须携带1。这会导致结果全为0,加上结转的1。该1存储在CPU的特殊位置,并且可以由分支指令使用,只要它不被后续算术运算覆盖即可。 (通常,这种所谓的进位不能用于编程语言。)
所以我们在这里看到的是65535 + 1的结果为0,这似乎是错误的。 但我们需要习惯这样的想法,即整数运算是以2 ^ n为模进行的,其中n是以位为单位的字大小。正确的结果是65536,而65536 mod2¹⁶是0。
我希望你的老师告诉你这些基础知识,否则问题似乎不公平。
那么,如果你忽视这一点会发生什么?你可能会得到错误的结果。
你怎么解决?使用两个整数来表示不适合一个整数的数字。如何做到这一点有很多可能性。一种易于理解但在内存效率方面不理想的可能性是:用2个整数表示天数。在第一个整数中,我们只计算数千。在第二个中,我们只代表最后3位数(十进制表示法)。例如,为了表示432105,我们将第一个整数设置为432,将第二个设置为105。