C Fixed Width Integers
Fixed-Width Integers
In C, the size of int
, short
, and long
types can vary depending on your computer and system.
For example, an int
might take up 2 bytes on one system, and 4 bytes on another.
To make programs behave the same everywhere, C provides fixed-width integer types in the <stdint.h>
header.
These types always have the same size (number of bits), no matter which computer you are on.
The most common fixed-width types are:
Type | Size | Range | Printf Specifier |
---|---|---|---|
int8_t |
8 bits (1 byte) | -128 to 127 | %d |
uint8_t |
8 bits (1 byte) | 0 to 255 | %u |
int16_t |
16 bits (2 bytes) | -32,768 to 32,767 | %d |
uint16_t |
16 bits (2 bytes) | 0 to 65,535 | %u |
int32_t |
32 bits (4 bytes) | -2,147,483,648 to 2,147,483,647 | %d |
uint32_t |
32 bits (4 bytes) | 0 to 4,294,967,295 | %u |
int64_t |
64 bits (8 bytes) | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | %lld |
uint64_t |
64 bits (8 bytes) | 0 to 18,446,744,073,709,551,615 | %llu |
The letter u
stands for unsigned, which means the type can only store
non-negative values (0 and up).
This doubles the maximum positive value compared to the signed version, but you lose the ability to store negative numbers.
Using Fixed-Width Integers
Example
#include <stdio.h>
#include <stdint.h> // needed for fixed-width integers
int main() {
int8_t a = 100; // 8-bit integer
int16_t b = 30000; // 16-bit integer
int32_t c = 2000000; // 32-bit integer
int64_t d = 9000000000; // 64-bit integer
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
printf("%lld\n", d); // use %lld for 64-bit
return 0;
}
When to Use Fixed-Width Integers?
For most everyday programs, you don't need these types - a normal
int
is usually fine.
But fixed-width integers are essential when:
- You are writing embedded systems (programs for small devices, like microcontrollers).
- You are working with file formats where exact sizes matter.
- You are sending data across networks and need consistent results on different machines.
Real Life Example
Imagine you are building a program that shows the battery level of a device.
Since the battery percentage will always be between 0 and 100, you don't need a large type like int
.
Instead, you can use uint8_t
, which is exactly 1 byte (8 bits) and can store values from 0 to 255:
Example
#include <stdio.h>
#include <stdint.h>
int main() {
uint8_t battery = 87; // battery level percentage
printf("Battery level is %u out of 100\n", battery);
return 0;
}
Here we save memory by using a uint8_t
, which is perfect for storing values in a small, well-defined range like a battery percentage.