# 8.2 Number Protocol

int `PyNumber_Check`(PyObject *o)
  Returns 1 if the object `o` provides numeric protocols, and false otherwise. This function always succeeds.

PyObject* `PyNumber_Add`(PyObject *o1, PyObject *o2)
  Returns the result of adding `o1` and `o2`, or null on failure. This is the equivalent of the Python expression: `o1+o2`.

PyObject* `PyNumber_Subtract`(PyObject *o1, PyObject *o2)
  Returns the result of subtracting `o2` from `o1`, or null on failure. This is the equivalent of the Python expression: `o1-o2`.

PyObject* `PyNumber_Multiply`(PyObject *o1, PyObject *o2)
  Returns the result of multiplying `o1` and `o2`, or null on failure. This is the equivalent of the Python expression: `o1*o2`.

PyObject* `PyNumber_Divide`(PyObject *o1, PyObject *o2)
  Returns the result of dividing `o1` by `o2`, or null on failure. This is the equivalent of the Python expression: `o1/o2`.

PyObject* `PyNumber_Remainder`(PyObject *o1, PyObject *o2)
  Returns the remainder of dividing `o1` by `o2`, or null on failure. This is the equivalent of the Python expression: `o1%o2`.

PyObject* `PyNumber_Divmod`(PyObject *o1, PyObject *o2)
  See the built-in function divmod. Returns NULL on failure. This is the equivalent of the Python expression: `divmod(o1,o2)`.

PyObject* `PyNumber_Power`(PyObject *o1, PyObject *o2, PyObject *o3)
  See the built-in function pow. Returns NULL on failure. This is the equivalent of the Python expression: `pow(o1,o2,o3)`, where `o3` is optional.

PyObject* `PyNumber_Negative`(PyObject *o)
  Returns the negation of `o` on success, or null on failure. This is the equivalent of the Python expression: `-o`.

PyObject* `PyNumber_Positive`(PyObject *o)
  Returns `o` on success, or NULL on failure. This is the equivalent of the Python expression: `+o`.

PyObject* `PyNumber_Absolute`(PyObject *o)
  Returns the absolute value of `o`, or null on failure. This is the equivalent of the Python expression: `abs(o)`.

PyObject* `PyNumber_Invert`(PyObject *o)
  Returns the bitwise negation of `o` on success, or NULL on failure. This is the equivalent of the Python expression: `õ`.

PyObject* `PyNumber_Lshift`(PyObject *o1, PyObject *o2)
  Returns the result of left shifting `o1` by `o2` on success, or NULL on failure. This is the equivalent of the Python expression: `o1 << o2`.

PyObject* `PyNumber_Rshift`(PyObject *o1, PyObject *o2)
  Returns the result of right shifting `o1` by `o2` on success, or NULL on failure. This is the equivalent of the Python expression: `o1 >> o2`.

PyObject* `PyNumber_And`(PyObject *o1, PyObject *o2)
  Returns the result of "anding" `o2` and `o2` on success and NULL on failure. This is the equivalent of the Python expression: `o1 and o2`.

PyObject* `PyNumber_Xor`(PyObject *o1, PyObject *o2)
  Returns the bitwise exclusive or of `o1` by `o2` on success, or NULL on failure. This is the equivalent of the Python expression: `o1^ o2`.

PyObject* `PyNumber_Or`(PyObject *o1, PyObject *o2)
  Returns the result of `o1` and `o2` on success, or NULL on failure. This is the equivalent of the Python expression: `o1 or o2`.

PyObject* `PyNumber_Coerce`(PyObject *o1, PyObject *o2)
  This function takes the addresses of two variables of type `PyObject*`.

  If the objects pointed to by `*p1` and `*p2` have the same type, increment their reference count and return 0 (success). If the objects can be converted to a common numeric type, replace `*p1` and `*p2` by their converted value (with 'new' reference counts), and return 0. If no conversion is possible, or if some other error occurs, return -1 (failure) and don't increment the reference counts. The call `PyNumber_Coerce(&o1, &o2)` is equivalent to the Python statement `o1, o2 = coerce(o1, o2)`.

PyObject* `PyNumber_Int`(PyObject *o)
  Returns the `o` converted to an integer object on success, or NULL on failure. This is the equivalent of the Python expression: `int(o)`.

PyObject* `PyNumber_Long`(PyObject *o)
  Returns the `o` converted to a long integer object on success, or NULL on failure. This is the equivalent of the Python expression: `long(o)`.

PyObject* `PyNumber_Float`(PyObject *o)
  Returns the `o` converted to a float object on success, or NULL on failure. This is the equivalent of the Python expression: `float(o)`.