Я должен сгенерировать уникальный номер в 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
метод будет вызываться только один раз во время запуска приложения (фаза инициализации):
0
в setClientId
метод.setClientId
метод.А потом, когда моя программа будет запущена (после инициализации), она продолжит вызывать getClientId
метод, чтобы дать мне фактический уникальный идентификатор клиента.
Это правильный способ создания уникального идентификатора для моей машины, который будет uint32_t
для программы на C ++? Я также уверен, что если значение достигает Integer.MAX_VALUE
затем установите его на 0 и начните снова. Должен ли я сделать это? Или я могу принять отрицательные значения для этого uint32_t
?
По сути, я хочу сгенерировать уникальный номер для моей машины, который всегда должен соответствовать uint32_t
, Если машина — новая машина, мы можем начать с числа 0 (bcoz, когда мы ищем значение для этой машины, дБ, никакого значения не будет, поэтому мы начнем с 0), но если машина уже выполняла этот код раньше , затем начните с того, что было последним сохраненным значением в базе данных.
Должен ли я сделать это? Или я могу принять и отрицательные значения для этого uint32_t?
Нет, вам не нужно, и вы также можете принимать отрицательные значения. Если вы передаете целое число Java в C ++ побитно, то unit32_t в C ++ будет продолжать увеличиваться, даже если переменная Java превышает максимальное значение и становится отрицательной. Это хорошо в целых числах со знаком 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
Также посмотрите этот ответ: Что происходит, когда вы увеличиваете число до максимального значения.
Других решений пока нет …