Using and Porting GNU CC

## 5.10: Double-Word Integers

GNU C supports data types for integers that are twice as long as
`long int`

. Simply write `long long int`

for a signed
integer, or `unsigned long long int`

for an unsigned integer.
To make an integer constant of type `long long int`

, add the suffix
`LL`

to the integer. To make an integer constant of type
`unsigned long long int`

, add the suffix `ULL`

to the integer.

You can use these types in arithmetic like any other integer types.
Addition, subtraction, and bitwise boolean operations on these types
are open-coded on all types of machines. Multiplication is open-coded
if the machine supports fullword-to-doubleword a widening multiply
instruction. Division and shifts are open-coded only on machines that
provide special support. The operations that are not open-coded use
special library routines that come with GNU CC.

There may be pitfalls when you use `long long`

types for function
arguments, unless you declare function prototypes. If a function
expects type `int`

for its argument, and you pass a value of type
`long long int`

, confusion will result because the caller and the
subroutine will disagree about the number of bytes for the argument.
Likewise, if the function expects `long long int`

and you pass
`int`

. The best way to avoid such problems is to use prototypes.