C++ - Numerics
Variable-width Integers
short
, int
, long
C leaves the size of an integer open: the compiler implementors could pick a size for int that performs best on the target computer architecture.
C++ only guarantees that integer variables will have a minimum size -- but they could be larger, depending on the target system.
x86_64 int is 32 bits, a long is 64 bits, and a pointer is 64 bits.
Fixed-width Integers
You should prefer the fixed-width integral types. (https://google.github.io/styleguide/cppguide.html#Integer_Types) Do not use built-in integer type other than int
(use int
for integers we know are not going to be too big).
Fixed-width Integers were introduced in C99 (in stdint.h
header) and C++11 (in cstdint
header)
Types with a prefix u
are unsigned.
type | bytes | range |
---|---|---|
std::int8_t |
1 byte | -128 to 127 |
std::uint8_t |
1 byte | 0 to 255 |
std::int16_t |
2 byte | -32,768 to 32,767 |
std::uint16_t |
2 byte | 0 to 65,535 |
std::int32_t |
4 byte | -2,147,483,648 to 2,147,483,647 |
std::uint32_t |
4 byte | 0 to 4,294,967,295 |
std::int64_t |
8 byte | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
std::uint64_t |
8 byte | 0 to 18,446,744,073,709,551,615 |
std::int8_t
and std::uint8_t
may be treated as signed char and unsigned char respectively.
It is safe for code to assume that <cstdint>
defines the type aliases int64_t
in the global namespaces as well as in namespace std
.
Fast and Least Types
C++ also defines two alternative sets of integers.
The fast type (std::int_fast#_t
) provides the fastest signed integer type with a width of at least # bits (where # = 8, 16, 32, or 64). For example, std::int_fast32_t
will give you the fastest signed integer type that’s at least 32 bits.
The least type (std::int_least#_t
) provides the smallest signed integer type with a width of at least # bits (where # = 8, 16, 32, or 64). For example, std::int_least32_t
will give you the smallest signed integer type that’s at least 32 bits.