The difference of int8_t, int_least8_t and int_fast8_t?

C

C Problem Overview


What is the difference between the int types int8_t, int_least8_t and int_fast8_t?

C Solutions


Solution 1 - C

The difference is defined in the sections of the C99 standard that Carl Norum quoted. But it may be useful to have an example.

Suppose you have a C compiler for a 36-bit system, with char = 9 bits, short = 18 bits, int = 36 bits, and long = 72 bits. Then

  • int8_t does not exist, because there is no way to satisfy the constraint of having exactly 8 value bits with no padding.
  • int_least8_t is a typedef of char. NOT of short or int, because the standard requires the smallest type with at least 8 bits.
  • int_fast8_t can be anything. It's likely to be a typedef of int if the "native" size is considered to be "fast".

Solution 2 - C

From the spec section 7.8.1.1 Exact-width integer types, paragraph 1:

> The typedef name intN_t designates a signed integer type with width N , no padding bits, and a two’s complement representation. Thus, int8_t denotes a signed integer type with a width of exactly 8 bits.

And from: 7.18.1.2 Minimum-width integer types, paragraph 1:

>The typedef name int_leastN_t designates a signed integer type with a width of at least N, such that no signed integer type with lesser size has at least the specified width. Thus, int_least32_t denotes a signed integer type with a width of at least 32 bits.

And finally from 7.18.1.3 Fastest minimum-width integer types, paragraph 2: >The typedef name int_fastN_t designates the fastest signed integer type with a width of at least N. The typedef name uint_fastN_t designates the fastest unsigned integer type with a width of at least N.

Solution 3 - C

Here's a conceptually simple answer: the width of int*N_t for all three types must be >= N. intN_t has exactly N bits, int_leastN_t is the least (narrowest) such type, and int_fastN_t is the fastest such type.

For example, on a machine with 8 bit bytes and 32 bit fast registers, int8_t and int_least8_t are aliased to signed char but int_fast8_t is aliased to int32_t. Whereas, if the implementation chose to define them, int_least24_t and int_fast24_t would both be aliased to int32_t, with int24_t left undefined.

Edit: as Technophile points out below, the real issue for fast types is memory, not registers (generally, operations on the low-order bits of registers can be done just as fast as on the whole register). For example, writing to an int8_t in memory may require loading the 32-bit word containing it, modifying just the byte, and then writing it back, whereas if it were stored in a 32-word it could be written without reading.

Solution 4 - C

intN_t (and uintN_t) is not required in all C99 implementations. These types are the "exact-width integer types". They are required in implementations where it makes sense to have them (basically every desktop computer).

int_leastN_t is required in all C99 implementation for values of N of 8, 16, 32, and 64. This is the "minimum-width integer types".

int_fastN_t is required in all C99 implementation for values of N of 8, 16, 32, and 64. This is the "fastest minimum-width integer types".

Solution 5 - C

These are related to the size of the integer and are just what they sound like.

int8_t is exactly 8 bits
int_least8_t is the smallest int type that has at least 8 bits
int_fast8_t is the fastest int type that has at least 8 bits.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNebulaFoxView Question on Stackoverflow
Solution 1 - Cdan04View Answer on Stackoverflow
Solution 2 - CCarl NorumView Answer on Stackoverflow
Solution 3 - CJim BalterView Answer on Stackoverflow
Solution 4 - CpmgView Answer on Stackoverflow
Solution 5 - CHoganView Answer on Stackoverflow