TS 18661-1:2014 defines macros for the width of integer types (the
number of value and sign bits). One benefit of these macros is they
can be used in #if preprocessor directives, whereas
sizeof cannot. The following macros are defined in
limits.h.
CHAR_WIDTH ¶SCHAR_WIDTH ¶UCHAR_WIDTH ¶SHRT_WIDTH ¶USHRT_WIDTH ¶INT_WIDTH ¶UINT_WIDTH ¶LONG_WIDTH ¶ULONG_WIDTH ¶LLONG_WIDTH ¶ULLONG_WIDTH ¶These are the widths of the types char, signed char,
unsigned char, short int, unsigned short int,
int, unsigned int, long int, unsigned long
int, long long int and unsigned long long int,
respectively.
Further such macros are defined in stdint.h. Apart from those for types specified by width (see Integers), the following are defined:
INTPTR_WIDTH ¶UINTPTR_WIDTH ¶PTRDIFF_WIDTH ¶SIG_ATOMIC_WIDTH ¶SIZE_WIDTH ¶WCHAR_WIDTH ¶WINT_WIDTH ¶These are the widths of the types intptr_t, uintptr_t,
ptrdiff_t, sig_atomic_t, size_t, wchar_t
and wint_t, respectively.
A common reason that a program needs to know how many bits are in an
integer type is for using an array of unsigned long int as a
bit vector. You can access the bit at index n with:
vector[n / ULONG_WIDTH] & (1UL << (n % ULONG_WIDTH))
Before ULONG_WIDTH was a part of the C language,
CHAR_BIT was used to compute the number of bits in an integer
data type.
int CHAR_BIT ¶This is the number of bits in a char. POSIX.1-2001 requires
this to be 8.
The number of bits in any data type type can be computed like this:
sizeof (type) * CHAR_BIT
That expression includes padding bits as well as value and sign bits.
On all systems supported by the GNU C Library, standard integer types other
than _Bool do not have any padding bits.
Portability Note: One cannot actually easily compute the number of usable bits in a portable manner.