C++ स्टैंडर्ड में int, long, long long के सटीक साइज निर्धारित नहीं हैं - केवल न्यूनतम रेंज दी गई है। वास्तविक साइज सिस्टम आर्किटेक्चर और ऑपरेटिंग सिस्टम पर निर्भर करता है।
डेटा मॉडल्स
| मॉडल | सिस्टम | int | long | long long | पॉइंटर |
| ILP32 | 32-bit Linux/Windows | 32-bit | 32-bit | 64-bit | 32-bit |
| LP64 | 64-bit Linux/macOS | 32-bit | 64-bit | 64-bit | 64-bit |
| LLP64 | 64-bit Windows | 32-bit | 32-bit | 64-bit | 64-bit |
| ILP64 | कुछ 64-bit Unix | 64-bit | 64-bit | 64-bit | 64-bit |
C++ स्टैंडर्ड गारंटीज (न्यूनतम)
| टाइप | न्यूनतम बिट्स | न्यूनतम रेंज |
| signed char | 8 | -127 से +127 |
| short / int | 16 | -32767 से +32767 |
| long | 32 | -2147483647 से +2147483647 |
| long long | 64 | -9223372036854775807 से +9223372036854775807 |
साइज चेक करने का कोड
#include <iostream>
#include <cstdint>
#include <climits>
using namespace std;
int main() {
cout << "=== साइज (बाइट्स में) ===\n";
cout << "bool: " << sizeof(bool) << endl;
cout << "char: " << sizeof(char) << " (CHAR_BIT=" << CHAR_BIT << ")\n";
cout << "short: " << sizeof(short) << endl;
cout << "int: " << sizeof(int) << endl;
cout << "long: " << sizeof(long) << endl;
cout << "long long: " << sizeof(long long) << endl;
cout << "float: " << sizeof(float) << endl;
cout << "double: " << sizeof(double) << endl;
cout << "long double: " << sizeof(long double) << endl;
cout << "void*: " << sizeof(void*) << endl;
cout << "size_t: " << sizeof(size_t) << endl;
cout << "ptrdiff_t: " << sizeof(ptrdiff_t) << endl;
cout << "\n=== बिट्स में ===\n";
cout << "int: " << sizeof(int) * 8 << " bits\n";
cout << "long: " << sizeof(long) * 8 << " bits\n";
cout << "long long: " << sizeof(long long) * 8 << " bits\n";
cout << "pointer: " << sizeof(void*) * 8 << " bits\n";
cout << "\n=== फिक्स्ड-विड्थ टाइप्स (<cstdint>) ===\n";
cout << "int8_t: " << sizeof(int8_t) << " bytes\n";
cout << "int16_t: " << sizeof(int16_t) << " bytes\n";
cout << "int32_t: " << sizeof(int32_t) << " bytes\n";
cout << "int64_t: " << sizeof(int64_t) << " bytes\n";
cout << "intptr_t: " << sizeof(intptr_t) << " bytes (पॉइंटर साइज)\n";
cout << "\n=== रेंज मैक्रोज़ ===\n";
cout << "INT_MIN: " << INT_MIN << "\n";
cout << "INT_MAX: " << INT_MAX << "\n";
cout << "LONG_MIN: " << LONG_MIN << "\n";
cout << "LONG_MAX: " << LONG_MAX << "\n";
cout << "LLONG_MIN: " << LLONG_MIN << "\n";
cout << "LLONG_MAX: " << LLONG_MAX << "\n";
return 0;
}
आउटपुट (64-bit Linux पर)
=== साइज (बाइट्स में) ===
bool: 1
char: 1 (CHAR_BIT=8)
short: 2
int: 4
long: 8
long long: 8
float: 4
double: 8
long double: 16
void*: 8
size_t: 8
ptrdiff_t: 8
=== बिट्स में ===
int: 32 bits
long: 64 bits
long long: 64 bits
pointer: 64 bits
=== फिक्स्ड-विड्थ टाइप्स ===
int8_t: 1 bytes
int16_t: 2 bytes
int32_t: 4 bytes
int64_t: 8 bytes
intptr_t: 8 bytes (पॉइंटर साइज)
=== रेंज मैक्रोज़ ===
INT_MIN: -2147483648
INT_MAX: 2147483647
LONG_MIN: -9223372036854775808
LONG_MAX: 9223372036854775807
LLONG_MIN: -9223372036854775808
LLONG_MAX: 9223372036854775807
आउटपुट (64-bit Windows पर)
int: 4 bytes (32 bits)
long: 4 bytes (32 bits) ← Windows पर long 32-bit है!
long long: 8 bytes (64 bits)
pointer: 8 bytes (64 bits)
बेस्ट प्रैक्टिस
- पोर्टेबल कोड के लिए
<cstdint> से int32_t, int64_t, uint32_t आदि उपयोग करें
int को 32-bit मानकर न चलें - static_assert(sizeof(int) == 4) जोड़ें
- पॉइंटर साइज के लिए
intptr_t/uintptr_t उपयोग करें
- कंपाइल-टाइम चेक:
static_assert(sizeof(long) >= 8, "Need 64-bit long")