Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

คำนวณช่วงค่าของชนิดข้อมูล (Data Types) ใน C++ แบบโปรแกรม

ใน 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) เมื่อต้องการขนาดคงที่