Long Long C++ là gì? Đây là một câu hỏi thường gặp, và để trả lời nó, chúng ta phải đào sâu vào một trong những khái niệm cốt lõi nhất của lập trình: các kiểu dữ liệu trong C/C++.
C++ vẫn là một ngôn ngữ lập trình cực kỳ mạnh mẽ và được sử dụng rộng rãi. Nếu bạn muốn thực sự làm chủ nó, việc nắm vững các kiểu dữ liệu là điều bắt buộc. Nó không chỉ là lý thuyết suông mà là nền tảng để bạn viết code sạch, hiệu quả và tránh những lỗi khó chịu.
Khi bắt đầu học bất kỳ ngôn ngữ nào, kiểu dữ liệu luôn là điểm khởi đầu cho phần code. Kiểu dữ liệu đơn giản là loại thông tin mà một biến có thể lưu trữ – ví dụ, số nguyên, số thực, ký tự, v.v. Mỗi ngôn ngữ đều có nhiều kiểu dữ liệu khác nhau, và việc hiểu rõ chúng giúp chúng ta sử dụng chúng một cách chính xác và tối ưu nhất.
Kiểu dữ liệu: Nền tảng mọi biến số trong C/C++
Kiểu dữ liệu xác định loại giá trị mà một biến có thể chứa. Chẳng hạn, một biến Boolean chỉ có thể chứa giá trị boolean (true/false), trong khi một biến số nguyên sẽ chứa các giá trị số nguyên.

Trong quá trình code, chúng ta cần nhiều biến khác nhau để lưu trữ các loại thông tin đa dạng. Biến về cơ bản chỉ là các vùng bộ nhớ được cấp phát để giữ một giá trị nào đó. Khi bạn khai báo một biến, bạn đang yêu cầu hệ thống dành ra một lượng không gian nhất định trong bộ nhớ.
Lượng bộ nhớ này không cố định; nó phụ thuộc hoàn toàn vào kiểu dữ liệu của biến. Bạn có thể muốn lưu trữ các kiểu dữ liệu như ký tự, ký tự rộng (wide character), số nguyên, số thực dấu phẩy động (floating-point), số thực dấu phẩy động độ chính xác kép (double floating point), Boolean, v.v. Hệ thống sẽ dựa vào kiểu dữ liệu để cấp phát bộ nhớ phù hợp và xác định những gì có thể được lưu trữ trong không gian đó.
Kiểu dữ liệu nguyên thủy: Các khối xây dựng cơ bản
Trong C/C++, chúng ta có các kiểu dữ liệu nguyên thủy (Primitive Types), còn được gọi là kiểu dữ liệu gốc hoặc kiểu dữ liệu có sẵn. Ngoài ra, C/C++ cũng hỗ trợ các kiểu dữ liệu do người dùng tự định nghĩa. Dưới đây là 7 kiểu dữ liệu cơ bản bạn sẽ thường xuyên gặp:
Kiểu dữ liệu | Từ khóa |
|---|---|
Boolean | bool |
Ký tự | char |
Số nguyên | int |
Số thực | float |
Số thực dạng Double | double |
Kiểu không có giá trị | void |
Kiểu Wide character | wchar_t |
Một số kiểu cơ bản này có thể được điều chỉnh bởi một hoặc nhiều từ khóa bổ trợ (modifier) sau:
signed(kiểu có dấu)unsigned(kiểu không có dấu)shortlong
Bảng dưới đây minh họa các kiểu biến, lượng bộ nhớ chúng sử dụng và phạm vi giá trị tối thiểu/tối đa mà chúng có thể lưu trữ:
Kiểu | Độ rộng bit | Dãy giá trị |
|---|---|---|
char | 1 byte | -127 tới 127 hoặc 0 tới 255 |
unsigned char | 1 byte | 0 tới 255 |
signed char | 1 byte | -127 tới 127 |
int | 4 byte | -2147483648 tới 2147483647 |
unsigned int | 4 byte | 0 tới 4294967295 |
signed int | 4 byte | -2147483648 tới 2147483647 |
short int | 2 byte | -32768 tới 32767 |
unsigned short int | Range | 0 tới 65,535 |
signed short int | Range | -32768 tới 32767 |
long int | 4 byte | -2,147,483,647 tới 2,147,483,647 |
signed long int | 4 byte | Tương tự như long int |
unsigned long int | 4 byte | 0 tới 4,294,967,295 |
float | 4 byte | +/- 3.4e +/- 38 (~7 chữ số) |
double | 8 byte | +/- 1.7e +/- 308 (~15 chữ số) |
long double | 8 byte | +/- 1.7e +/- 308 (~15 chữ số) |
wchar_t | 2 hoặc 4 byte | 1 wide character |
Lưu ý quan trọng: Kích thước thực tế của các biến có thể khác so với bảng trên. Điều này phụ thuộc vào trình biên dịch (compiler) và kiến trúc máy tính bạn đang sử dụng.
Để kiểm tra kích thước chính xác trên hệ thống của bạn, hãy chạy ví dụ code C++ sau:
#include <iostream>
using namespace std;
int main()
{
cout << "Kich co cua char la: " << sizeof(char) << endl;
cout << "Kich co cua int la: " << sizeof(int) << endl;
cout << "Kich co cua short int la: " << sizeof(short int) << endl;
cout << "Kich co cua long int la: " << sizeof(long int) << endl;
cout << "Kich co cua float la: " << sizeof(float) << endl;
cout << "Kich co cua double la: " << sizeof(double) << endl;
cout << "Kich co cua wchar_t la: " << sizeof(wchar_t) << endl;
return 0;
}Trong đoạn code trên, chúng ta sử dụng endl để chèn một ký tự xuống dòng sau mỗi thông báo, và toán tử << để xuất nhiều giá trị ra màn hình. Đặc biệt, toán tử sizeof() được dùng để lấy kích thước (bằng byte) của các kiểu dữ liệu khác nhau.
Khi biên dịch và chạy đoạn code này, bạn sẽ nhận được kết quả tương tự như sau (nhớ rằng kết quả có thể thay đổi tùy thuộc vào môi trường của bạn):
Kich co cua char la: 1
Kich co cua int la: 4
Kich co cua short int la: 2
Kich co cua long int la: 4
Kich co cua float la: 4
Kich co cua double la: 8
Kich co cua wchar_t la: 4Tùy chỉnh kiểu dữ liệu: typedef và enum
Khai báo typedef: Đặt biệt danh cho kiểu dữ liệu
Bạn có thể tạo một tên mới, một biệt danh, cho một kiểu dữ liệu đã tồn tại bằng cách sử dụng từ khóa typedef trong C/C++. Cú pháp rất đơn giản:
typedef kieu_du_lieu ten_moi;Ví dụ, đoạn code sau báo cho trình biên dịch rằng sothuc là một tên khác của kiểu float:
typedef float sothuc;Giờ đây, bạn hoàn toàn có thể khai báo một biến số thực tên là vantoc như sau, và nó sẽ hoạt động y hệt như khi bạn dùng float vantoc;:
sothuc vantoc;Kiểu liệt kê enum: Định nghĩa các hằng số rõ ràng
Kiểu liệt kê enum cho phép bạn khai báo một tên kiểu tùy chỉnh và một tập hợp các định danh (Identifier) có thể được sử dụng làm giá trị cho kiểu đó. Mỗi định danh trong enum là một hằng số có kiểu là kiểu liệt kê.
Để tạo một kiểu liệt kê, bạn sử dụng từ khóa enum. Cú pháp chung là:
enum ten_cua_enum { danh sach cac ten } danh_sach_bien;Trong đó, ten_cua_enum là tên của kiểu liệt kê. Các tên trong danh sách được phân tách bằng dấu phẩy.
Ví dụ, đoạn code sau định nghĩa một kiểu liệt kê sanpham và một biến c thuộc kiểu sanpham. Sau đó, c được gán giá trị maytinh:
enum sanpham { laptop, maytinh, dienthoai } c;
c = maytinh;Mặc định, các giá trị trong danh sách sẽ bắt đầu từ 0 và tăng dần. Tức là laptop là 0, maytinh là 1, và dienthoai là 2. Tuy nhiên, bạn có thể gán một giá trị cụ thể cho bất kỳ tên nào bằng cách thêm một giá trị khởi tạo (Initializer). Ví dụ, trong khai báo sau, maytinh sẽ có giá trị là 50:
enum sanpham { laptop, maytinh=50, dienthoai };Khi đó, dienthoai sẽ tự động có giá trị là 51, vì mỗi tên tiếp theo sẽ có giá trị lớn hơn tên trước đó là 1.
Datatype Modifier: Mở rộng và thu hẹp phạm vi dữ liệu
Đúng như tên gọi, các datatype modifier được sử dụng với các kiểu dữ liệu có sẵn để điều chỉnh độ dài và phạm vi của dữ liệu. Chúng cho phép bạn tối ưu hóa việc sử dụng bộ nhớ và xử lý các giá trị lớn hơn hoặc nhỏ hơn bình thường.
Các trình chỉnh sửa kiểu dữ liệu có sẵn trong C++ bao gồm:
Signed (có dấu): Cho phép lưu trữ cả số dương và số âm.
Unsigned (không dấu): Chỉ cho phép lưu trữ số dương (bao gồm 0), tăng gấp đôi phạm vi giá trị dương.
Short (ngắn): Giảm kích thước bộ nhớ, thu hẹp phạm vi giá trị.
Long (dài): Tăng kích thước bộ nhớ, mở rộng phạm vi giá trị.
Bảng dưới đây tóm tắt kích thước (bằng byte) và phạm vi của các kiểu dữ liệu khi được kết hợp với các trình chỉnh sửa phù hợp:
Data Type | Size (in bytes) | Range |
|---|---|---|
short int | 2 | -32,768 tới 32,767 |
unsigned short int | 2 | 0 tới 65,535 |
unsigned int | 4 | 0 tới 4,294,967,295 |
int | 4 | -2,147,483,648 tới 2,147,483,647 |
long int | 4 | -2,147,483,648 tới 2,147,483,647 |
unsigned long int | 4 | 0 tới 4,294,967,295 |
long long int | 8 | -(2^63) tới (2^63)-1 |
unsigned long long int | 8 | 0 tới 18,446,744,073,709,551,615 |
signed char | 1 | -128 tới 127 |
unsigned char | 1 | 0 tới 255 |
float | 4 | -3.4×10^38 tới 3.4×10^38 |
double | 8 | -1.7×10^308 tới 1.7×10^308 |
long double | 12 | -1.1×10^4932 tới 1.1×10^4932 |
wchar_t | 2 hoặc 4 | 1 ký tự chiều rộng |
Lưu ý: Một lần nữa, các giá trị và kích thước trên có thể thay đổi tùy thuộc vào trình biên dịch và kiến trúc hệ thống.
Tóm lại, khi bắt đầu hành trình code với bất kỳ ngôn ngữ lập trình nào, việc đầu tiên bạn cần làm là hiểu rõ các kiểu dữ liệu. Khi bạn đã nắm vững cách sử dụng chúng trong C++, bạn sẽ nhanh chóng phát triển các ứng dụng một cách tự tin hơn. Dưới đây là những điểm mấu chốt cần nhớ về các kiểu dữ liệu trong C++:
C++ phân loại dữ liệu thành 3 kiểu chính: nguyên thủy (primitive), trừu tượng (abstract/user-defined) và dẫn xuất (derived).
Các kiểu dữ liệu nguyên thủy bao gồm số nguyên (integer), số thực dấu phẩy động (floating-point), ký tự (character), boolean, số thực dấu phẩy động kép (double floating-point), kiểu không giá trị (valueless hay void), và ký tự rộng (wide character).
Các kiểu dữ liệu trừu tượng hoặc do người dùng xác định bao gồm class, enum, union, structure, và typedef.
Các kiểu dữ liệu dẫn xuất bao gồm mảng (array), hàm (function), con trỏ (pointer), và tham chiếu (reference).
Các bộ chỉnh sửa dữ liệu như
short,long,signedvàunsignedcó thể được áp dụng cho các kiểu dữ liệu nhưint,double,charđể điều chỉnh kích thước và phạm vi giá trị của chúng.



