Basic Concepts
C++ provides various integer types, with the main difference being the size of memory (width) used, allowing for different ranges of integer values. The C++ standard specifies the minimum width of these types, but the actual implementation may vary depending on the compiler and platform.
Type Specifications
| Type | Minimum Width | Typical Width | Minimum Value Range |
|---|---|---|---|
| short | 16 bits | 16 bits | -32,768 to 32,767 |
| int | 16 bits | 32 bits | -32,768 to 32,767 |
| long | 32 bits | 32/64 bits | -2,147,483,648 to 2,147,483,647 |
| long long | 64 bits | 64 bits | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
Code Example
#include <iostream>
#include <climits> // Include integer limit constants
#include <cstdint> // C++11 fixed-width integer types
using namespace std;
int main() {
// 1. Display the exact size of each type
cout << "=== Actual size of each integer type in the current system ===" << endl;
cout << "short: " << sizeof(short) << " bytes (" << sizeof(short) * 8 << " bits)" << endl;
cout << "int: " << sizeof(int) << " bytes (" << sizeof(int) * 8 << " bits)" << endl;
cout << "long: " << sizeof(long) << " bytes (" << sizeof(long) * 8 << " bits)" << endl;
cout << "long long: " << sizeof(long long) << " bytes (" << sizeof(long long) * 8 << " bits)" << endl;
// 2. Display the value range of each type
cout << "\n=== Value range of each integer type ===" << endl;
cout << "short: " << SHRT_MIN << " to " << SHRT_MAX << endl;
cout << "int: " << INT_MIN << " to " << INT_MAX << endl;
cout << "long: " << LONG_MIN << " to " << LONG_MAX << endl;
cout << "long long: " << LLONG_MIN << " to " << LLONG_MAX << endl;
// 3. Range of unsigned versions
cout << "\n=== Value range of unsigned integer types ===" << endl;
cout << "unsigned short: 0 to " << USHRT_MAX << endl;
cout << "unsigned int: 0 to " << UINT_MAX << endl;
cout << "unsigned long: 0 to " << ULONG_MAX << endl;
cout << "unsigned long long: 0 to " << ULLONG_MAX << endl;
// 4. Practical usage examples
cout << "\n=== Practical usage examples ===" << endl;
// short - suitable for small range integers
short temperature = -10;
short studentCount = 150;
cout << "Temperature: " << temperature << "°C" << endl;
cout << "Number of students: " << studentCount << endl;
// int - the most commonly used integer type
int population = 500000;
int bankBalance = -2500;
cout << "City population: " << population << endl;
cout << "Bank balance: " << bankBalance << endl;
// long - suitable for larger integers
long worldPopulation = 7800000000L; // Use L suffix to indicate long
long fileSize = 2147483647L;
cout << "World population: " << worldPopulation << endl;
cout << "File size: " << fileSize << " bytes" << endl;
// long long - suitable for very large integers
long long nationalDebt = 28000000000000LL; // Use LL suffix to indicate long long
long long distanceToStar = 9460730472580800LL;
cout << "National debt: $" << nationalDebt << endl;
cout << "Distance to star: " << distanceToStar << " kilometers" << endl;
// 5. Demonstration of the importance of type selection
cout << "\n=== Importance of type selection ===" << endl;
// Correct type selection
short smallValue = 30000; // Within short range
cout << "Small value: " << smallValue << " (using short, saves memory)" << endl;
// Potential issue - overflow
short overflowExample = 32767; // Maximum value of short
cout << "Before overflow: " << overflowExample << endl;
overflowExample += 1;
cout << "After overflow: " << overflowExample << " (incorrect result!)" << endl;
// 6. Demonstration of platform dependency
cout << "\n=== Demonstration of platform dependency ===" << endl;
cout << "Note: The size of long may vary on different platforms:" << endl;
cout << "- Typically 4 bytes on 32-bit systems" << endl;
cout << "- Typically 8 bytes on 64-bit systems" << endl;
// 7. C++11 fixed-width integer types (optional)
#ifdef __cpp11
cout << "\n=== C++11 Fixed-width Integer Types ===" << endl;
cout << "int16_t: " << sizeof(int16_t) << " bytes" << endl;
cout << "int32_t: " << sizeof(int32_t) << " bytes" << endl;
cout << "int64_t: " << sizeof(int64_t) << " bytes" << endl;
#endif
return 0;
}
Type Selection Guide
#include <iostream>
// Choose the appropriate integer type based on the application scenario
class IntegerTypeSelector {
public:
// Scenario 1: Small range counting (0-255)
static unsigned char countSmallItems() {
unsigned char itemCount = 200; // Sufficient to store 0-255
return itemCount;
}
// Scenario 2: Medium range values (-32,768 to 32,767)
static short calculateTemperature() {
short temp = -156; // Temperature range on Earth is fully sufficient
return temp;
}
// Scenario 3: General integer calculations
static int calculateSum(int a, int b) {
return a + b; // int is the most natural choice
}
// Scenario 4: Large file processing or large data volumes
static long processLargeFile() {
long fileBytes = 2147483647L; // Exceeds 2 billion bytes
return fileBytes;
}
// Scenario 5: Astronomical numbers or large financial data
static long long calculateNationalBudget() {
long long budget = 5000000000000LL; // 5 trillion
return budget;
}
};
int main() {
cout << "=== Best Practices for Type Selection ===" << endl;
// Example 1: Choosing the right type to save memory
unsigned char smallCounter = IntegerTypeSelector::countSmallItems();
cout << "Small counter: " << static_cast<int>(smallCounter) << " (using unsigned char)" << endl;
// Example 2: Handling temperature data
short temperature = IntegerTypeSelector::calculateTemperature();
cout << "Extreme temperature: " << temperature << "°C (using short)" << endl;
// Example 3: General calculation
int result = IntegerTypeSelector::calculateSum(1000, 2000);
cout << "Calculation result: " << result << " (using int)" << endl;
// Example 4: Large file processing
long fileSize = IntegerTypeSelector::processLargeFile();
cout << "File size: " << fileSize << " bytes (using long)" << endl;
// Example 5: Extremely large values
long long budget = IntegerTypeSelector::calculateNationalBudget();
cout << "National budget: $" << budget << " (using long long)" << endl;
return 0;
}
Important Considerations
#include <iostream>
int main() {
cout << "=== Important Considerations When Using Integer Types ===" << endl;
// 1. Literal suffixes
long bigNumber = 100L; // L indicates long
long long hugeNumber = 100LL; // LL indicates long long
unsigned int positive = 100U; // U indicates unsigned
cout << "long literal: " << bigNumber << endl;
cout << "long long literal: " << hugeNumber << endl;
cout << "unsigned literal: " << positive << endl;
// 2. Avoid implicit type conversion issues
int a = 100000;
short b = a; // May lose data
cout << "Original value: " << a << endl;
cout << "Converted value: " << b << " (data loss!)" << endl;
// 3. Use static_cast for safe conversion
short safeConversion = static_cast<short>(a);
cout << "Safe conversion: " << safeConversion << " (but still at risk of data loss)" << endl;
// 4. Check range before conversion
if (a >= SHRT_MIN && a <= SHRT_MAX) {
short safeShort = static_cast<short>(a);
cout << "Conversion within safe range: " << safeShort << endl;
} else {
cout << "Warning: Value exceeds short range, conversion will lose data!" << endl;
}
return 0;
}
Output Examples
=== Actual size of each integer type in the current system ===
short: 2 bytes (16 bits)
int: 4 bytes (32 bits)
long: 8 bytes (64 bits)
long long: 8 bytes (64 bits)
=== Value range of each integer type ===
short: -32768 to 32767
int: -2147483648 to 2147483647
long: -9223372036854775808 to 9223372036854775807
long long: -9223372036854775808 to 9223372036854775807
=== Practical usage examples ===
Temperature: -10°C
Number of students: 150
City population: 500000
Bank balance: -2500
World population: 7800000000
File size: 2147483647 bytes
National debt: $28000000000000
Distance to star: 9460730472580800 kilometers
Key Takeaways
- Minimum Width Guarantee: The C++ standard only specifies minimum widths; actual sizes may vary by platform.
- Memory Efficiency: Choose the most appropriate type based on value range to save memory.
- Portability: Avoid hardcoding assumptions about type sizes.
- Overflow Protection: Always check value ranges to prevent overflow.
- Type Safety: Use explicit type conversions and check ranges.
- Literal Suffixes: Use the correct suffixes (L, LL, U) to clarify types.
By choosing and using these integer types wisely, you can write efficient and portable C++ code.