- required by ANSI C to use a binary representation
- typically use two's complement arithmetic
`char`

**usually**the smallest chunk of memory that can be operated on, typically an 8 bit byte`unsigned char`

uses all available bits to represent the value`signed char`

reserves one bit for a sign flag (to switch between positive and negative values)- on a machine with 8 bit bytes and two's complement arithmetic,
`unsigned char`

can hold values between 0 and 255`signed char`

can hold values between -127 and 127

- without a
`signed`

or`unsigned`

qualifier,`char`

may use whichever representation is more efficient on the target machine - Example declarations:
`unsigned char a`

`signed char b`

`char ch`

`int`

- minimum of 16 bits wide (usually 2 bytes)
- just as with
`char`

, an`int`

can be`signed`

or`unsigned`

- the
`signed`

qualifier is the default on all`int`

types (that is,`int`

and`signed int`

mean the same thing, making the`signed`

qualifier optional) - three sizes of
`int`

-`short int`

,`int`

, and`long int`

`int`

is usually the most efficient fundamental datatype because it is normally the same size as a machine word- in the mid '90s, most common Unix workstations have 32 bit words and
thus use 32 bit
`int`

s `short int`

is smaller than or the same size as`int`

`long int`

is larger than or the same size as`int`

- for
`short int`

and`long int`

, the`int`

is optional.

- Example declarations:
`int i`

`signed i`

*(same as*`int i`

)`unsigned j`

`short smaller`

`unsigned short small`

`long large`

`unsigned long largest`

- machine dependent ranges for the
`char`

and`int`

types are defined in the`<limits.h>`

file - minimum ranges as defined by ANSI C:
CHAR_BIT 8 /* number of bits in a 'char' */ SCHAR_MIN -127 /* minimum value for 'signed char' */ SCHAR_MAX 127 /* maximum value for 'signed char' */ UCHAR_MAX 255 /* maximum value for 'unsigned char' */ SHRT_MIN -32767 /* minimum value for '(signed) short (int)' */ SHRT_MAX 32767 /* maximum value for '(signed) short (int)' */ USHRT_MAX 65535 /* maximum value for 'unsigned short' */ INT_MIN -32767 /* minimum value for '(signed) int' */ INT_MAX 32767 /* maximum value for '(signed) int' */ UINT_MAX 65535 /* maximum value for 'unsigned int' */ LONG_MIN -2147483647 /* minimum value for '(signed) long (int)' */ LONG_MAX 2147483647 /* maximum value for '(signed) long (int)' */ ULONG_MAX 4294967295 /* maximum value for 'unsigned long (int)' */

- if
`char`

is an unsigned value, these values are also defined:CHAR_MIN 0 CHAR_MAX UCHAR_MAX

- otherwise (if
`char`

is signed):CHAR_MIN SCHAR_MIN CHAR_MAX SCHAR_MAX

`float`

,`double`

and`long double`

have the same relation to each other that the integer`short`

,`int`

and`long`

types have`double`

is usually the most efficient real number representation`float`

is smaller than or the same size as`double`

`long double`

(which is an ANSI C invention) is larger than or the same size as`double`

- due to rounding problems, it's generally true that
`(a / b) * b`

will almost never yield the original value of`a`

- Example declarations:
`float f`

`double dbl`

`long double huge`

- machine dependent characteristics for the
`float`

and`double`

types are defined in the`<float.h>`

file