(See also type for type system overview and the list of typerelated utilities that are provided by the C library).
Boolean type
Note that conversion to _Bool does not work the same as conversion to other integer types:  (since C99) 
signed char
 type for signed character representation. unsigned char
 type for unsigned character representation. Also used to inspect object representations (raw memory). char
 type for character representation. Equivalent to either signed char
or unsigned char
(which one is implementationdefined and may be controlled by a compiler commandline switch), but char
is a distinct type, different from both signed char
and unsigned char
Note that the standard library also defines typedef names wchar_t
, char16_t
, and char32_t
(since C11) to represent wide characters.
short int
(also accessible as short
, may use the keyword signed
) unsigned short int
(also accessible as unsigned short
) int
(also accessible as signed int
) unsigned int
(also accessible as unsigned
), the unsigned counterpart of int
, implementing modulo arithmetic. Suitable for bit manipulations. long int
(also accessible as long
) unsigned long int
(also accessible as unsigned long
)
 (since C99) 
Note: as with all type specifiers, any order is permitted: unsigned long long int
and long int unsigned long
name the same type.
The following table summarizes all available integer types and their properties:
Type specifier  Equivalent type  Width in bits by data model  

C standard  LP32  ILP32  LLP64  LP64  
short  short int  at least 16  16  16  16  16 
short int 

signed short 

signed short int 

unsigned short  unsigned short int 

unsigned short int 

int  int  at least 16  16  32  32  32 
signed 

signed int 

unsigned  unsigned int 

unsigned int 

long  long int  at least 32  32  32  32  64 
long int 

signed long 

signed long int 

unsigned long  unsigned long int 

unsigned long int 

long long  long long int (C99)  at least 64  64  64  64  64 
long long int 

signed long long 

signed long long int 

unsigned long long  unsigned long long int (C99) 

unsigned long long int 
Besides the minimal bit counts, the C Standard guarantees that 1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
.
Note: this allows the extreme case in which bytes are sized 64 bits, all types (including char
) are 64 bits wide, and sizeof
returns 1 for every type.
Note: integer arithmetic is defined differently for the signed and unsigned integer types. See arithmetic operators, in particular integer overflows.
The choices made by each implementation about the sizes of the fundamental types are collectively known as data model. Four data models found wide acceptance:
32 bit systems:
64 bit systems:
Other models are very rare. For example, ILP64 (8/8/8: int, long, and pointer are 64bit) only appeared in some early 64bit Unix systems (e.g. Unicos on Cray).
Note that exactwidth integer types are available in <stdint.h> since C99.
C has three or six (since C23) types for representing real floatingpoint values:
float
 single precision floating point type. Matches IEEE754 binary32 format if supported. double
 double precision floating point type. Matches IEEE754 binary64 format if supported. long double
 extended precision floating point type. Matches IEEE754 binary128 format if supported, otherwise matches IEEE754 binary64extended format if supported, otherwise matches some nonIEEE754 extended floatingpoint format as long as its precision is better than binary64 and range is at least as good as binary64, otherwise matches IEEE754 binary64 format. long double
in the same format as double
, i.e. binary64).
 (since C23) 
Floatingpoint types may support special values:
INFINITY
0.0
. It compares equal to the positive zero, but is meaningful in some arithmetic operations, e.g. 1.0/0.0 == INFINITY
, but 1.0/0.0 == INFINITY
) nan
, NAN
. Note that C takes no special notice of signaling NaNs (specified by IEEE754), and treats all NaNs as quiet. Real floatingpoint numbers may be used with arithmetic operators +  / * and various mathematical functions from <math.h>
. Both builtin operators and library functions may raise floatingpoint exceptions and set errno
as described in math_errhandling
.
Floatingpoint expressions may have greater range and precision than indicated by their types, see FLT_EVAL_METHOD
. Assignment, return, and cast force the range and precision to the one associated with the declared type.
Floatingpoint expressions may also be contracted, that is, calculated as if all intermediate values have infinite range and precision, see #pragma STDC FP_CONTRACT
.
Some operations on floatingpoint numbers are affected by and modify the state of the floatingpoint environment (most notably, the rounding direction).
Implicit conversions are defined between real floating types and integer, complex, and imaginary types.
See Limits of floating point types and the math.h
library for additional details, limits, and properties of the floatingpoint types.
Complex floating typesComplex floating types model the mathematical complex numbers, that is the numbers that can be written as a sum of a real number and a real number multiplied by the imaginary unit: a + bi. The three complex types are.
Note: as with all type specifiers, any order is permitted: #include <complex.h> #include <stdio.h> int main(void) { double complex z = 1 + 2*I; z = 1/z; printf("1/(1.0+2.0i) = %.1f%+.1fi\n", creal(z), cimag(z)); } Output: 1/(1.0+2.0i) = 0.20.4i
Each complex type has the same object representation and alignment requirements as an array of two elements of the corresponding real type ( float a[4] = {1, 2, 3, 4}; float complex z1, z2; memcpy(&z1, a, sizeof z1); // z1 becomes 1.0 + 2.0i memcpy(&z2, a+2, sizeof z2); // z2 becomes 3.0 + 4.0i Complex numbers may be used with arithmetic operators +  * and /, possibly mixed with imaginary and real numbers. There are many mathematical functions defined for complex numbers in Increment and decrement are not defined for complex types. Relational operators are not defined for complex types (there is no notion of "less than") Implicit conversions are defined between complex types and other arithmetic types. In order to support the oneinfinity model of complex number arithmetic, C regards any complex value with at least one infinite part as an infinity even if its other part is a NaN, guarantees that all operators and functions honor basic properties of inifinities and provides #include <stdio.h> #include <complex.h> #include <math.h> int main(void) { double complex z = (1 + 0*I) * (INFINITY + I*INFINITY); // textbook formula would give // (1+i0)(∞+i∞) ⇒ (1×∞ – 0×∞) + i(0×∞+1×∞) ⇒ NaN + I*NaN // but C gives a complex infinity printf("%f + i*%f\n", creal(z), cimag(z)); // textbook formula would give // cexp(∞+iNaN) ⇒ exp(∞)×(cis(NaN)) ⇒ NaN + I*NaN // but C gives ±∞+i*nan double complex y = cexp(INFINITY + I*NAN); printf("%f + i*%f\n", creal(y), cimag(y)); } Possible output: inf + i*inf inf + i*nan C also treats multiple infinities so as to preserve directional information where possible, despite the inherent limitations of the Cartesian representation: multiplying the imaginary unit by real infinity gives the correctlysigned imaginary infinity: i × ∞ = i∞. Also, i × (∞ – i∞) = ∞ + i∞ indicates the reasonable quadrant. Imaginary floating typesImaginary floating types model the mathematical imaginary numbers, that is numbers that can be written as a real number multiplied by the imaginary unit: bi The three imaginary types are.
Note: as with all type specifiers, any order is permitted: #include <complex.h> #include <stdio.h> int main(void) { double imaginary z = 3*I; z = 1/z; printf("1/(3.0i) = %+.1fi\n", cimag(z)); } Output: 1/(3.0i) = 0.3i
Each of the three imaginary types has the same object representation and alignment requirement as its corresponding real type ( Note: despite that, imaginary types are distinct and not compatible with their corresponding real types, which prohibits aliasing. Imaginary numbers may be used with arithmetic operators +  * and /, possibly mixed with complex and real numbers. There are many mathematical functions defined for imaginary numbers in Increment and decrement are not defined for imaginary types Implicit conversions are defined between imaginary types and other arithmetic types. The imaginary numbers make it possible to express all complex numbers using the natural notation Imaginary types also simplify implementations; multiplication of an imaginary by a complex can be implemented straightforwardly with two multiplications if the imaginary types are supported, instead of four multiplications and two additions.  (since C99) 
char
, int
, short
, long
, signed
, unsigned
, float
, double
. _Bool
, _Complex
, _Imaginary
, _Decimal32
, _Decimal64
, _Decimal128
.
The following table provides a reference for the limits of common numeric representations.
Prior to C23, the C Standard allowed any signed integer representation, and the minimum guaranteed range of Nbit signed integers was from \(\scriptsize (2^{N1}1)\)(2N1
1) to \(\scriptsize +2^{N1}1\)+2N1
1 (e.g. 127 to 127 for a signed 8bit type), which corresponds to the limits of one's complement or signandmagnitude.
However, all popular data models (including all of ILP32, LP32, LP64, LLP64) and almost all C compilers use two's complement representation (the only known exceptions are some compliers for UNISYS), and as of C23, it is the only representation allowed by the standard, with the guaranteed range from \(\scriptsize 2^{N1}\)2N1
to \(\scriptsize +2^{N1}1\)+2N1
1 (e.g. 128 to 127 for a signed 8bit type).
Type  Size in bits  Format  Value range  

Approximate  Exact  
character  8  signed  128 to 127  
unsigned  0 to 255  
16  UTF16  0 to 65535  
32  UTF32  0 to 1114111 (0x10ffff)  
integer  16  signed  ± 3.27 · 10^{4}  32768 to 32767 
unsigned  0 to 6.55 · 10^{4}  0 to 65535  
32  signed  ± 2.14 · 10^{9}  2,147,483,648 to 2,147,483,647  
unsigned  0 to 4.29 · 10^{9}  0 to 4,294,967,295  
64  signed  ± 9.22 · 10^{18}  9,223,372,036,854,775,808 to 9,223,372,036,854,775,807  
unsigned  0 to 1.84 · 10^{19}  0 to 18,446,744,073,709,551,615  
binary floating point  32  IEEE754 


64  IEEE754 



80^{[note 1]}  x86 



128  IEEE754 



decimal floating point  32  IEEE754 


64  IEEE754 


128  IEEE754 

Note: actual (as opposed to guaranteed minimal) ranges are available in the library headers <limits.h>
and <float.h>
.
C++ documentation for Fundamental types 
© cppreference.com
Licensed under the Creative Commons AttributionShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/arithmetic_types