Numbers in C
Integer Types
Integers are whole numbers that can be positive, negative, or zero. They come in multiple sizes depending on memory and range requirements.
C supports signed (default) and unsigned versions of integers. Exact sizes and ranges are implementation-defined; use `sizeof` and the limits in `
Type | Typical Size | Range (typical) |
---|---|---|
short int | 2 bytes | -32,768 to 32,767 |
unsigned short int | 2 bytes | 0 to 65,535 |
int | 4 bytes | -2,147,483,648 to 2,147,483,647 |
unsigned int | 4 bytes | 0 to 4,294,967,295 |
long int | 4 or 8 bytes | System-dependent |
unsigned long int | 4 or 8 bytes | System-dependent, non-negative |
long long int | 8 bytes | ≈ −9.22e18 to 9.22e18 |
unsigned long long int | 8 bytes | 0 to ≈ 1.84e19 |
Floating-Point Types
Floating-point numbers represent real numbers with decimal parts.
`float` provides single precision (about 6–7 digits), while `double` provides double precision (about 15–16 digits).
`long double` may offer higher precision, but its exact precision and size are platform/compiler dependent.
#include <stdio.h>
int main(void) {
float pi = 3.14159f;
double g = 9.80665;
printf("pi=%.2f g=%.5f\n", pi, g);
return 0;
}
pi=3.14 g=9.80665
Finding Sizes and Ranges
Use `sizeof` to get sizes, and `
#include <stdio.h>
#include <limits.h>
#include <float.h>
int main(void) {
printf("short: %zu bytes, range [%d, %d]\n", sizeof(short), SHRT_MIN, SHRT_MAX);
printf("int: %zu bytes, range [%d, %d]\n", sizeof(int), INT_MIN, INT_MAX);
printf("long: %zu bytes, range [%ld, %ld]\n", sizeof(long), LONG_MIN, LONG_MAX);
printf("long long: %zu bytes, range [%lld, %lld]\n", sizeof(long long), LLONG_MIN, LLONG_MAX);
printf("float: %zu bytes, ~%d digits, max %.0e\n", sizeof(float), FLT_DIG, FLT_MAX);
printf("double: %zu bytes, ~%d digits, max %.0e\n", sizeof(double), DBL_DIG, DBL_MAX);
return 0;
}
short: 2 bytes, range [-32768, 32767] int: 4 bytes, range [-2147483648, 2147483647] long: 8 bytes, range [-9223372036854775808, 9223372036854775807] long long: 8 bytes, range [-9223372036854775808, 9223372036854775807] float: 4 bytes, ~6 digits, max 3e+38 double: 8 bytes, ~15 digits, max 1e+308
Integer & Floating Literal Suffixes
You can control literal types using suffixes:
Literal | Type |
---|---|
42U | unsigned int |
42L | long int |
42LL | long long int |
1.0f | float |
1.0 | double (default) |
1.0L | long double |
Choosing the Right Number Type
• Use `int` for counting items, loop indices, and most whole numbers.
• Use `long long` (or an unsigned variant) for very large integers.
• Use `double` by default for real-number calculations; reserve `float` for memory-sensitive cases.
• Use fixed-width types from `
• Be aware of overflow: signed integer overflow is undefined behavior; unsigned overflow wraps modulo 2ⁿ.