# HG changeset patch # User Michael Lutz # Date 2021-08-15 10:14:53 # Node ID 31b085404537cd616753c74538437d31c16e1dd8 # Parent 095192372b19d32d84eefe835e5b00c9490e407d Fix 2183fd4d: [NewGRF] Use divide instead of right shift for signed numbers. (#9480) "For negative a, the value of a >> b is implementation-defined (in most implementations, this performs arithmetic right shift, so that the result remains negative)." diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -1189,7 +1189,7 @@ int GetEngineProperty(EngineID engine, P if (callback != CALLBACK_FAILED) { if (is_signed) { /* Sign extend 15 bit integer */ - return static_cast(callback << 1) >> 1; + return static_cast(callback << 1) / 2; } else { return callback; } diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -363,7 +363,7 @@ int Train::GetCurveSpeedLimit() const /* Apply max_speed modifier (cached value is fixed-point binary with 8 fractional bits) * and clamp the result to an acceptable range. */ - max_speed += (max_speed * this->tcache.cached_curve_speed_mod) >> 8; + max_speed += (max_speed * this->tcache.cached_curve_speed_mod) / 256; max_speed = Clamp(max_speed, 2, absolute_max_speed); }