1

我必须在 Java 中生成一个唯一编号(对于我运行代码的机器),以便在 C++ 中它可以对应于uint32_t. 一般来说,其他 C++ 程序应该能够正确地读取这个唯一的数字作为uint32_t. 我在一个字节数组中发送这个信息,其他 C++ 程序正在反序列化它以获得这个数字。到目前为止,我无法在 C++ 程序中更改此数字的数据类型。

  private static final AtomicInteger clientId = new AtomicInteger(0);

  // will be called many time when the program is running after initialization
  public static int getClientId() {
    int counter = clientId.incrementAndGet();
    return counter == Integer.MAX_VALUE ? 0 : counter;
  }

  // called only once at startup
  public static void setClientId(final int counter) {
    clientId.addAndGet(counter == Integer.MAX_VALUE ? 0 : counter);
  }

所以我想出了上面的代码。在应用程序启动(初始化阶段)期间,我的setClientId方法只会被调用一次:

  • 如果这台机器是第一次运行代码,就像它是一台新机器,那么我将传递0setClientId方法。
  • 如果这台机器已经在运行代码但我们重新启动了服务器,那么我将在数据库中查找这台机器最后保存的值是什么(因为我们也每隔几分钟将这个值保存在 db 中),然后我将传递它方法的价值setClientId

然后稍后当我的程序运行时(在初始化之后),它将继续调用getClientId方法来给我实际的唯一 clientId。

这是为我的机器生成uint32_t用于 C++ 程序的唯一 ID 的正确方法吗?我还确保如果值达到Integer.MAX_VALUE然后将其设置为 0 并重新开始。我必须这样做吗?或者我也可以为此取负值uint32_t

基本上,我想为我的机器生成一个唯一编号,该编号应始终对应于uint32_t. 如果机器是新机器,我们可以从数字 0 开始(bcoz 当我们在数据库中查找这台机器的值时,不会有任何值,所以我们将从 0 开始)但是如果机器之前已经运行过这段代码,然后从数据库中最后保存的值开始。

4

1 回答 1

1

我必须这样做吗?或者我也可以为这个 uint32_t 取负值?

不,你不必这样做,你也可以取负值。如果您将 Java 整数逐位传递给 C++,即使 Java 变量超过最大值并变为负数,C++ 中的 unit32_t 也会继续增加。这是 2 的补码有符号整数的好处,Java 用它来表示整数值。

这是一个 4 位示例,说明了正在发生的事情:

Bits  Unsigned  Signed
0000         0       0
0001         1       1
0010         2       2
0011         3       3
0100         4       4
0101         5       5
0110         6       6
0111         7       7
1000         8      -8
1001         9      -7
1010        10      -6
1011        11      -5
1100        12      -4
1101        13      -3
1110        14      -2
1111        15      -1

另请参阅此答案:当您将整数增加超过其最大值时会发生什么

于 2017-01-23T01:10:13.163 回答