Built In Types: Int

The integer type int is signed and uses twos-complement representation for negative values. At least 64 bits are used, so the range of values that can be stored is at least [-9223372036854775808, 9223372036854775807].

Namespace HH\Lib\Math contains the following integer-related constants: INT64_MAX, INT64_MIN, INT32_MAX, INT32_MIN, INT16_MAX, INT16_MIN, and UINT32_MAX.

Refer to your compiler's documentation to find the behavior when the largest int value is incremented, the smallest value is decremented, and the unary minus is applied to the smallest value.

Consider the following example:

<?hh // strict

namespace Hack\UserDocumentation\Types\Int\Examples\LeapYearTest;

function is_leap_year(int $yy): bool {
	return ((($yy & 3) === 0) && (($yy % 100) !== 0)) || (($yy % 400) === 0);
}

<<__EntryPoint>>
function main(): void {
  $year = 2001;
  $result = is_leap_year($year);
  echo "$year is " . (($result === true) ? "" : "not ") . "a leap year\n";
}
Output
2001 is not a leap year

When called, function is_leap_year takes one argument, of type int, and returns a value of type bool. (A year is a leap year if it is a multiple of 4 but not a multiple of 100—for example, 1700, 1800, and 1900 were not leap years—or it's a multiple of 400. Some redundant grouping parentheses have been added to aid readability.)

The bitwise AND operator, &, and the remainder operator, %, require operands of type int.

Like 3, 0, 100, and 400, 2001 is an int literal, so the local variable $year is inferred as having type int. (Unlike function parameters such as $yy, or a function return, a local variable cannot have an explicit type.) Then when $year is passed to is_leap_year, the compiler sees that an int was passed and an int was expected, so the call is well-formed.