Skip to content

🎯 Kiểu dữ liệu cơ bản trong C++

📖 Giới thiệu

Kiểu dữ liệu (data types) quy định loại thông tin mà một biến có thể lưu trữ và các phép toán có thể thực hiện trên nó. Trong C++, việc hiểu rõ các kiểu dữ liệu cơ bản là rất quan trọng vì nó ảnh hưởng đến cách chương trình lưu trữ và xử lý thông tin.

C++ là ngôn ngữ có kiểu dữ liệu mạnh (strongly typed), nghĩa là mỗi biến phải có một kiểu cụ thể và không thể tự động chuyển đổi sang kiểu khác một cách tuỳ tiện.

Trong bài này, chúng ta sẽ tìm hiểu 4 kiểu dữ liệu cơ bản nhất: int (số nguyên), float/double (số thực), char (ký tự), và bool (logic).

🔧 Cú pháp

Kiểu số nguyên (Integer Types)

cpp
// Kiểu int cơ bản
int age = 25;                    // Số nguyên 32-bit
short shortNum = 1000;           // Số nguyên 16-bit  
long longNum = 1000000L;         // Số nguyên 64-bit
long long veryLongNum = 999999999999LL; // Số nguyên 64-bit

// Có dấu và không dấu
unsigned int positiveOnly = 3000000000U; // Chỉ số dương
signed int withSign = -12345;    // Có thể âm hoặc dương (mặc định)

Kiểu số thực (Floating Point Types)

cpp
float price = 99.99f;            // Số thực độ chính xác đơn (32-bit)
double distance = 123.456789;    // Số thực độ chính xác kép (64-bit)
long double precision = 123.456789123456789L; // Độ chính xác mở rộng

Kiểu ký tự (Character Type)

cpp
char letter = 'A';               // Một ký tự ASCII
char digit = '5';                // Ký tự số (không phải số 5)
char symbol = '@';               // Ký tự đặc biệt
char newline = '\n';             // Ký tự điều khiển (xuống dòng)

Kiểu logic (Boolean Type)

cpp
bool isTrue = true;              // Giá trị đúng
bool isFalse = false;            // Giá trị sai
bool result = (5 > 3);           // Kết quả của phép so sánh

Ký tự đặc biệt (Escape Sequences)

cpp
char tab = '\t';                 // Tab
char backslash = '\\';           // Dấu gạch chéo ngược
char quote = '\'';               // Dấu nháy đơn
char nullChar = '\0';            // Ký tự null (kết thúc chuỗi)

🔬 Phân tích & Giải thích chi tiết

Kích thước và phạm vi các kiểu dữ liệu

KiểuKích thướcPhạm viSử dụng
bool1 bytetrue/falseLogic, điều kiện
char1 byte-128 đến 127Ký tự ASCII
short2 bytes-32,768 đến 32,767Số nguyên nhỏ
int4 bytes-2,147,483,648 đến 2,147,483,647Số nguyên thông thường
long8 bytes±9 x 10¹⁸Số nguyên lớn
float4 bytes±3.4 x 10³⁸ (7 chữ số)Số thực độ chính xác đơn
double8 bytes±1.7 x 10³⁰⁸ (15 chữ số)Số thực độ chính xác kép

Khi nào dùng kiểu nào?

int - Cho số nguyên thông thường

cpp
int studentCount = 30;           // Số lượng học sinh
int temperature = -5;            // Nhiệt độ (có thể âm)
int score = 95;                  // Điểm số

float vs double - Cho số thực

cpp
// Dùng float khi:
float price = 19.99f;            // Giá tiền (độ chính xác vừa đủ)
float percentage = 85.5f;        // Phần trăm

// Dùng double khi:
double scientificValue = 3.141592653589793; // Tính toán khoa học
double bankBalance = 1234567.89; // Số tiền lớn, cần độ chính xác cao

char - Cho ký tự đơn

cpp
char grade = 'A';                // Điểm chữ
char choice = 'y';               // Lựa chọn (y/n)
char operation = '+';            // Phép toán

bool - Cho logic

cpp
bool isAdult = true;             // Trạng thái logic
bool hasPermission = false;      // Quyền hạn
bool isComplete = (progress == 100); // Kết quả so sánh

Chuyển đổi kiểu tự động (Implicit Conversion)

C++ có thể tự động chuyển đổi giữa các kiểu tương thích:

cpp
int a = 10;
double b = a;        // int → double: OK, không mất dữ liệu
int c = 3.14;        // double → int: Cảnh báo, mất phần thập phân (c = 3)

Overflow và Underflow

cpp
// Overflow - vượt quá giá trị tối đa
int max = 2147483647;    // Giá trị lớn nhất của int
int overflow = max + 1;  // Tràn số → số âm rất lớn

// Underflow - dưới giá trị tối thiểu  
int min = -2147483648;   // Giá trị nhỏ nhất của int
int underflow = min - 1; // Tràn số → số dương rất lớn

💻 Ví dụ minh họa

Chương trình demo các kiểu dữ liệu

cpp
#include <iostream>
#include <iomanip>  // Để định dạng output
using namespace std;

int main() {
    cout << "=== DEMO CÁC KIỂU DỮ LIỆU CƠ BẢN ===" << endl;
    
    // Kiểu số nguyên
    int age = 25;
    short year = 2024;
    long population = 98000000L;
    
    cout << "\n1. KIỂU SỐ NGUYÊN:" << endl;
    cout << "Tuổi (int): " << age << endl;
    cout << "Năm (short): " << year << endl;
    cout << "Dân số VN (long): " << population << endl;
    
    // Kiểu số thực
    float height = 170.5f;
    double weight = 65.25;
    double bmi = weight / ((height/100) * (height/100));
    
    cout << "\n2. KIỂU SỐ THỰC:" << endl;
    cout << "Chiều cao (float): " << height << " cm" << endl;
    cout << "Cân nặng (double): " << weight << " kg" << endl;
    cout << fixed << setprecision(2);  // 2 chữ số thập phân
    cout << "BMI (tính toán): " << bmi << endl;
    
    // Kiểu ký tự
    char grade = 'A';
    char symbol = '@';
    char newline = '\n';
    
    cout << "\n3. KIỂU KÝ TỰ:" << endl;
    cout << "Điểm chữ: " << grade << endl;
    cout << "Ký hiệu: " << symbol << endl;
    cout << "Xuống dòng: " << (int)newline << " (mã ASCII)" << endl;
    
    // Kiểu logic
    bool isPassed = (grade == 'A' || grade == 'B');
    bool isFailed = !isPassed;
    
    cout << "\n4. KIỂU LOGIC:" << endl;
    cout << "Đã qua môn: " << boolalpha << isPassed << endl;  // hiện true/false
    cout << "Trượt môn: " << boolalpha << isFailed << endl;
    
    return 0;
}

Kết quả:

=== DEMO CÁC KIỂU DỮ LIỆU CƠ BẢN ===

1. KIỂU SỐ NGUYÊN:
Tuổi (int): 25
Năm (short): 2024
Dân số VN (long): 98000000

2. KIỂU SỐ THỰC:
Chiều cao (float): 170.5 cm
Cân nặng (double): 65.25 kg
BMI (tính toán): 22.46

3. KIỂU KÝ TỰ:
Điểm chữ: A
Ký hiệu: @
Xuống dòng: 10 (mã ASCII)

4. KIỂU LOGIC:
Đã qua môn: true
Trượt môn: false

Chương trình quản lý điểm số

cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    // Thông tin sinh viên
    string studentName;
    int studentId;
    char class_letter;
    
    // Điểm số
    float math, physics, chemistry;
    double average;
    
    // Trạng thái
    bool isPassed;
    char grade;
    
    cout << "=== HỆ THỐNG QUẢN LÝ ĐIỂM ===" << endl;
    
    // Nhập thông tin
    cout << "Tên sinh viên: ";
    getline(cin, studentName);
    
    cout << "Mã số SV: ";
    cin >> studentId;
    
    cout << "Lớp (A/B/C): ";
    cin >> class_letter;
    
    cout << "Điểm Toán: ";
    cin >> math;
    
    cout << "Điểm Lý: ";
    cin >> physics;
    
    cout << "Điểm Hóa: ";
    cin >> chemistry;
    
    // Tính toán
    average = (math + physics + chemistry) / 3.0;
    isPassed = (average >= 5.0);
    
    // Xếp loại
    if (average >= 9.0) {
        grade = 'A';
    } else if (average >= 8.0) {
        grade = 'B';
    } else if (average >= 6.5) {
        grade = 'C';
    } else if (average >= 5.0) {
        grade = 'D';
    } else {
        grade = 'F';
    }
    
    // Hiển thị kết quả
    cout << "\n=== KẾT QUẢ HỌC TẬP ===" << endl;
    cout << "Sinh viên: " << studentName << endl;
    cout << "MSSV: " << studentId << endl;
    cout << "Lớp: " << class_letter << endl;
    cout << "Điểm TB: " << average << "/10" << endl;
    cout << "Xếp loại: " << grade << endl;
    cout << "Kết quả: " << (isPassed ? "ĐẬU" : "TRƯỢT") << endl;
    
    return 0;
}

Chương trình demo chuyển đổi kiểu

cpp
#include <iostream>
using namespace std;

int main() {
    cout << "=== DEMO CHUYỂN ĐỔI KIỂU ===" << endl;
    
    // Chuyển đổi tự động (implicit)
    int intValue = 42;
    double doubleValue = intValue;        // int → double
    cout << "int → double: " << intValue << " → " << doubleValue << endl;
    
    double pi = 3.14159;
    int truncated = pi;                   // double → int (mất phần thập phân)
    cout << "double → int: " << pi << " → " << truncated << endl;
    
    // Ép kiểu (explicit casting)
    double price = 199.99;
    int roundedPrice = (int)(price + 0.5); // Làm tròn thủ công
    cout << "Làm tròn: " << price << " → " << roundedPrice << endl;
    
    // Ký tự và số
    char letter = 'A';
    int asciiValue = letter;              // char → int (mã ASCII)
    cout << "Ký tự → ASCII: '" << letter << "' → " << asciiValue << endl;
    
    int number = 65;
    char character = (char)number;         // int → char
    cout << "ASCII → Ký tự: " << number << " → '" << character << "'" << endl;
    
    // Boolean và số
    bool truth = true;
    int truthValue = truth;               // bool → int (true = 1, false = 0)
    cout << "bool → int: " << boolalpha << truth << " → " << truthValue << endl;
    
    int zero = 0, nonZero = 42;
    bool isZero = zero;                   // int → bool (0 = false, khác 0 = true)
    bool isNonZero = nonZero;
    cout << "int → bool: " << zero << " → " << boolalpha << isZero << endl;
    cout << "int → bool: " << nonZero << " → " << boolalpha << isNonZero << endl;
    
    return 0;
}

🏋️ Thực hành

Bài tập 1: Khai báo đúng kiểu

Chọn kiểu dữ liệu phù hợp cho các biến sau:

  • Tuổi của một người
  • Giá của một món hàng
  • Điểm chữ (A, B, C, D, F)
  • Trạng thái đã kết hôn hay chưa
  • Số điện thoại (chỉ lưu trữ, không tính toán)

Bài tập 2: Tính toán với nhiều kiểu

Viết chương trình:

  1. Nhập chiều dài và chiều rộng (số thực)
  2. Tính diện tích và chu vi
  3. Hiển thị kết quả với 2 chữ số thập phân

Bài tập 3: Chuyển đổi nhiệt độ

Viết chương trình chuyển đổi từ Celsius sang Fahrenheit:

  • Công thức: F = C × 9/5 + 32
  • Sử dụng kiểu double cho độ chính xác

Bài tập 4: Phân tích overflow

Dự đoán kết quả của đoạn code sau:

cpp
int max = 2147483647;
int result1 = max + 1;
int result2 = max + 2;
cout << result1 << endl;
cout << result2 << endl;

Lời giải chi tiết

Bài tập 1:

cpp
int age;                    // Tuổi - số nguyên từ 0-120
double price;               // Giá - cần độ chính xác cao cho tiền tệ  
char grade;                 // Điểm chữ - một ký tự
bool isMarried;             // Tình trạng hôn nhân - true/false
string phoneNumber;         // SĐT - chuỗi (có thể có +, -, khoảng trắng)

Bài tập 2:

cpp
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    double length, width;
    
    cout << "Nhập chiều dài: ";
    cin >> length;
    cout << "Nhập chiều rộng: ";
    cin >> width;
    
    double area = length * width;
    double perimeter = 2 * (length + width);
    
    cout << fixed << setprecision(2);
    cout << "Diện tích: " << area << " m²" << endl;
    cout << "Chu vi: " << perimeter << " m" << endl;
    
    return 0;
}

Bài tập 3:

cpp
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    double celsius, fahrenheit;
    
    cout << "Nhập nhiệt độ Celsius: ";
    cin >> celsius;
    
    fahrenheit = celsius * 9.0/5.0 + 32;
    
    cout << fixed << setprecision(2);
    cout << celsius << "°C = " << fahrenheit << "°F" << endl;
    
    return 0;
}

Bài tập 4:

cpp
// Kết quả sẽ là:
// result1 = -2147483648 (tràn số về giá trị âm nhỏ nhất)
// result2 = -2147483647 (tiếp tục đếm từ giá trị âm)

📋 Tóm tắt

🎯 Những gì đã học

  • 4 kiểu cơ bản: int (số nguyên), float/double (số thực), char (ký tự), bool (logic)
  • Kích thước và phạm vi: Mỗi kiểu có giới hạn về giá trị và bộ nhớ
  • Chuyển đổi kiểu: Tự động (implicit) và ép kiểu (explicit casting)
  • Overflow/Underflow: Vượt quá giới hạn sẽ gây ra tràn số

🔧 Nguyên tắc chọn kiểu dữ liệu

  • int: Số nguyên thông thường (-2 tỷ đến +2 tỷ)
  • double: Số thực cần độ chính xác cao
  • float: Số thực độ chính xác vừa đủ, tiết kiệm bộ nhớ
  • char: Một ký tự ASCII
  • bool: Giá trị logic true/false

🚀 Chuẩn bị cho bước tiếp theo

Bài học tiếp theo sẽ tìm hiểu về các toán tử trong C++. Đảm bảo bạn đã:

  • [x] Hiểu được 4 kiểu dữ liệu cơ bản
  • [x] Biết kích thước và phạm vi của từng kiểu
  • [x] Nắm được cách chuyển đổi giữa các kiểu
  • [x] Hiểu khái niệm overflow và underflow

💡 Lời khuyên quan trọng

"Chọn kiểu dữ liệu phù hợp ngay từ đầu sẽ giúp tránh bugs và tối ưu hiệu suất chương trình!"


Chuyển sang: Toán tử để học về các phép toán số học, logic và so sánh trong C++!

Khóa học C++ miễn phí