В Java эта строка:
long fnv_prime = 0x811C9DC5;
даст в fnv_prime
числовое значение -2128831035, потому что константа интерпретируется как int
, что является 32-битным значением со знаком в Java. Это значение затем расширяется до знака при записи в long
.
И наоборот, в коде Objective-C:
int64_t fnv_prime = 0x811C9DC5;
0x811C9DC5
интерпретируется как константа unsigned int
(поскольку она не помещается в 32-битный int
со знаком) с числовым значением 2166136261. Затем это значение записывается в fnv_prime
, и имеется Никаких признаков расширения, поскольку для компилятора C это значение положительное.
Таким образом, вы получите разные значения для fnv_prime
, что объясняет ваши отличные результаты.
Это можно исправить в Java, добавив суффикс "L
", например:
long fnv_prime = 0x811C9DC5L;
, который заставляет компилятор Java интерпретировать константу как long
с тем же числовым значением, что и то, что вы получаете с кодом Objective-C.