0

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

我在谷歌上搜索了它,但它返回的唯一内容是如何将两个数字放在一起,以及对确定性主题的深入研究。

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

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

4

3 回答 3

1

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

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

于 2013-03-04T18:13:11.163 回答
1

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

于 2013-03-04T18:13:34.490 回答
1

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

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

但是,如果您避免这些情况,那么 - 没有任何平台2+2可以在4.

于 2013-03-04T18:15:13.703 回答