ใน C++ ชนิดข้อมูลแต่ละชนิดมีขนาดและช่วงค่าที่แตกต่างกัน สามารถคำนวณได้ด้วยโปรแกรมโดยใช้ sizeof และคณิตศาสตร์พื้นฐาน
หลักการคำนวณ
- ขนาดในบิต =
sizeof(type) * 8 - Signed (มีเครื่องหมาย): ช่วงคือ
-2^(n-1)ถึง2^(n-1) - 1 - Unsigned (ไม่มีเครื่องหมาย): ช่วงคือ
0ถึง2^n - 1
ตัวอย่างโค้ด
#include <iostream>
#include <cmath>
#include <climits>
#include <cfloat>
using namespace std;
#define SIZE_BITS(x) (sizeof(x) * 8)
void printRange(const string& typeName, int bits, bool isSigned) {
if (isSigned) {
long long minVal = -1LL << (bits - 1);
long long maxVal = (1LL << (bits - 1)) - 1;
cout << typeName << ": " << minVal << " ถึง " << maxVal << endl;
} else {
unsigned long long maxVal = (bits == 64) ? ULLONG_MAX : ((1ULL << bits) - 1);
cout << typeName << ": 0 ถึง " << maxVal << endl;
}
}
int main() {
cout << "=== ช่วงค่าของชนิดข้อมูลพื้นฐาน ===" << endl;
// ใช้ค่าจาก climits/cfloat สำหรับความแม่นยำ
cout << "signed char: " << SCHAR_MIN << " ถึง " << SCHAR_MAX << endl;
cout << "unsigned char: 0 ถึง " << UCHAR_MAX << endl;
cout << "short: " << SHRT_MIN << " ถึง " << SHRT_MAX << endl;
cout << "unsigned short: 0 ถึง " << USHRT_MAX << endl;
cout << "int: " << INT_MIN << " ถึง " << INT_MAX << endl;
cout << "unsigned int: 0 ถึง " << UINT_MAX << endl;
cout << "long: " << LONG_MIN << " ถึง " << LONG_MAX << endl;
cout << "unsigned long: 0 ถึง " << ULONG_MAX << endl;
cout << "long long: " << LLONG_MIN << " ถึง " << LLONG_MAX << endl;
cout << "unsigned long long: 0 ถึง " << ULLONG_MAX << endl;
cout << endl << "=== ชนิดข้อมูลจุดทศนิยม (ประมาณ) ===" << endl;
cout << "float: " << FLT_MIN << " ถึง " << FLT_MAX << " (precision: " << FLT_DIG << " digits)" << endl;
cout << "double: " << DBL_MIN << " ถึง " << DBL_MAX << " (precision: " << DBL_DIG << " digits)" << endl;
cout << "long double: " << LDBL_MIN << " ถึง " << LDBL_MAX << " (precision: " << LDBL_DIG << " digits)" << endl;
return 0;
}
ผลลัพธ์ตัวอย่าง (ระบบ 64-bit)
=== ช่วงค่าของชนิดข้อมูลพื้นฐาน === signed char: -128 ถึง 127 unsigned char: 0 ถึง 255 short: -32768 ถึง 32767 unsigned short: 0 ถึง 65535 int: -2147483648 ถึง 2147483647 unsigned int: 0 ถึง 4294967295 long: -9223372036854775808 ถึง 9223372036854775807 unsigned long: 0 ถึง 18446744073709551615 long long: -9223372036854775808 ถึง 9223372036854775807 unsigned long long: 0 ถึง 18446744073709551615 === ชนิดข้อมูลจุดทศนิยม (ประมาณ) === float: 1.17549e-38 ถึง 3.40282e+38 (precision: 6 digits) double: 2.22507e-308 ถึง 1.79769e+308 (precision: 15 digits) long double: 3.3621e-4932 ถึง 1.18973e+4932 (precision: 18 digits)
หมายเหตุสำคัญ
- ขนาดของ
int,longอาจแตกต่างกันไปตามแพลตฟอร์ม (32/64-bit) - ชนิดจุดทศนิยมใช้มาตรฐาน IEEE 754 ช่วงค่าเป็นค่าประมาณ
- ควรใช้
<cstdint>(เช่นint32_t,uint64_t) เมื่อต้องการขนาดคงที่