Приведение long.MaxValue -> float -> long приводит к переполнению значения - PullRequest
0 голосов
/ 07 января 2019

В последнее время мы заметили довольно серьезную проблему в нашей кодовой базе, из-за которой наш ГСЧ помешался. В настоящее время все наши игровые переменные сохраняются как числа с плавающей запятой, среди них максимальное значение long с игрового сервера. Когда это анализируется клиентом, он превращает число с плавающей запятой обратно в long. Пока все в порядке, мы думали, поскольку поплавок просто усекается. Однако при ближайшем рассмотрении это на самом деле не так. По неизвестным причинам длительный переполнен до отрицательного значения -9223372036854775808.

Почему это? Почему переполнение?

Вот простой пример C # для воспроизведения:

static void Main(string[] args)
{    
    float test = long.MaxValue;
    long testLong = (long) test;
    Console.WriteLine("[random debug]: " + test + " vs. " +testLong);
}

который напечатает:

[random debug]: 9.223372E+18 vs. -9223372036854775808
...