整数决定论

时间:2013-03-04 18:07:55

标签: c++ c cpu cpu-architecture

我只是想问一下,整数是否确定?我知道它们应该是,但它们在所有平台上都是一样的吗?

我在Google上搜索了它,但它唯一返回的是如何将两个数字放在一起,并对决定论主题进行深入研究。

我问的原因是因为我打算开发一个具有锁步网络模型的小型演示。屏幕上会有几个可以通过命令移动的块,并且正在考虑给出所有块的整数值。

这也让我想到了一般的RTS游戏总是要与浮点数的desync斗争(这不是他们去同步的唯一原因,但仍然是desyncs的一个主要因素)。为什么这些游戏不只是使用64位整数存储所有单位位置等等。我认为64位具有存储gazilion不同值的能力将足以处理单位位置等。

3 个答案:

答案 0 :(得分:1)

只有少数例外情况(例如,内存访问时序和明确的随机操作,如RDRAND),CPU上的所有操作都是确定性的,包括整数和浮点运算。

网络游戏中的Desyncs往往是游戏逻辑错误的结果,而不是架构问题。

答案 1 :(得分:1)

在某种程度上。只要没有任何操作溢出,算术运算的结果将始终相同。有符号整数溢出的结果是未定义的。即使在程序的相同调用内,编译器优化也可能导致不同的结果。无符号溢出的结果是明确定义的;只要两个平台具有相同的UINT_MAX值,结果将始终相同。您也不能依赖平台使用的实际二进制表示。如果要在不同的机器之间传递整数,则必须使用某种形式的序列化。

答案 2 :(得分:1)

有一些重要的未定义行为案例;例如,如果你的表达式生成一个越界有符号整数值,即使作为一个中间步骤,那么任何事情都可能发生。 (并且“越界”在某种程度上取决于系统;例如,int不能保证正好是32位。)还有一些实现定义的行为;例如,负有符号整数值的右移是实现定义的,这意味着编译器可以决定它想要如何处理它,并且必须记录该决定。

当然,在多线程的情况下,除非你注意正确处理同步,否则几乎所有的赌注都会被取消。

但是如果你避免这些情况,那么 - 2+2除了4之外没有其他平台。