You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
value: -9223372036854775808literal: -9.2233720368548E+18eq: neqvalue: 9223372036854775807literal: 9223372036854775807eq: eq# Exactly the same behavior with int32 (if rewrite assertions and run on x86 environment):value: -2147483648literal: -2147483648# <<< Note that in this case, the literal is displayed "as is", # however, the equivalence with the PHP_INT_MIN is still violatedeq: neqvalue: 2147483647literal: 2147483647eq: eq
-9223372036854775808 is valid int64 min value on x64 platform.
-2147483648 is valid int32 min value on x86 platform.
All versions of PHP (checked since php 7.0) are affected by this bug. This error is reproduced both on Debian linux and on Windows (checked for win11).
PHP Version
7.0.0 ... 8.2.4 (Any)
Operating System
No response
The text was updated successfully, but these errors were encountered:
Multiple programming languages, including PHP, parse negative numbers written in code not as simple negative numbers but as positive numbers negated. For example, "-123" is not the number -123 but the number 123 negated. Or 123 * -1 if you want to think of it that way.
This works fine - except for the case of PHP_INT_MIN, as -9223372036854775808 will be understood as 9223372036854775808 negated, and 9...808 is too large for a positive integer and thus forced to a float before the negation can happen.
If you really want that large (small?) of a number written in code then use PHP_INT_MIN instead.
I'd like to see this documented and don't see it in the integers page, which hints at this by saying that negative numbers can be written with the "negation operator", so...
Simply put, the positive literal number 9223372036854775808 is read first as T_DEC, which overflows to become a floating point number, and then the unary negation operator is applied to it.
Understand, thanks!
Perhaps then an alternative definition of such a literal should be added to the documentation:
Description
PHP literal value of the minimal int64 overflows min bound value.
The following code:
See https://3v4l.org/QpWHc
Resulted in this output:
But I expected this output instead:
-9223372036854775808
is valid int64 min value on x64 platform.-2147483648
is valid int32 min value on x86 platform.All versions of PHP (checked since php 7.0) are affected by this bug. This error is reproduced both on Debian linux and on Windows (checked for win11).
PHP Version
7.0.0 ... 8.2.4 (Any)
Operating System
No response
The text was updated successfully, but these errors were encountered: