Kiểu dữ liệu size_t
thực chất cũng là một kiểu dữ liệu không dấu mà giá trị của nó phụ thuộc vào từng chương trình cụ thể chứ không phải được cố định sẵn như các kiểu dữ liệu không dấu khác, ví dụ kiểu dữ liệu không dấu unsigned int
được cố định sẵn trong miền giá trị từ 0 đến $2^{32}$, do đó nếu bạn lưu giá trị lớn hơn khả năng chứa của unsigned int
, chắc chắn sẽ bị tràn số. Trong khi đó, size_t
rất linh hoạt, có thể tự mở rộng miền giá trị ra để đáp ứng con số lớn hơn.
#include
using namespace std;
int main(){
size_t A = 100;
cout <<"Kieu du lieu cua A la: "<< typeid(A).name() << endl;
}
Kết quả đoạn chương trình trên ,
Có thể bạn sẽ phân vân tại sao khai báo kiểu dữ liệu size_t
mà kết quả trả về lại là unsigned int
? Bởi vì theo như mình nói, mặc dù giá trị của size_t
không cố định và nó chỉ thay đổi khi cần, còn mặc định size_t
sẽ là unsigned int
.
Bạn đang đọc: t trong C++ là gì?
Nếu để ý bạn sẽ thấy, có rất nhiều hàm trong thư viện chuẩn của C/C++ nhận tham số vào với kiểu dữ liệu là size_t
với mục đích có thể lưu miền giá trị lớn nhất có thể, ví dụ như các hàm cấp phát bộ nhớ động trong C. Mình sẽ ví dụ hai đoạn chương trình bên dưới để bạn có thể rõ hơn cách size_t
hoạt động.
Đoạn chương trình sử dụng int
khi khai báo biến i
,
#include
#include
using namespace std;
// Chương trình vòng lặp
// Mỗi lần lặp tăng lên 10 triệu, dừng lại khi i >= N
int main(){
// Số lớn nhất mà kiểu dữ liệu số
// nguyên có thể chứa.
cout << INT_MAX << endl;
unsigned long N = 3000000000;
for(int i = 0; i < N; i += 10000000){
cout << i << endl;
}
}
Kết quả của đoạn chương trình trên là bị tràn số tại vòng lặp thứ 215 bởi kiểu dữ liệu số nguyên int
không thể chứa lớn hơn giá trị mà nó có thể chứa được INT_MAX = 2147483647
. Nhưng nếu bạn thay int i = 0
thành size_t i = 0
thì sao? Mọi chuyện sẽ khác, size_t
sẽ tự động chuyển sang kiểu dữ liệu không dấu khác lớn hơn, sẽ không xảy ra vấn đề tràn số và chương trình của bạn hoạt động ok.
#include
#include
using namespace std;
// Chương trình vòng lặp
// Mỗi lần lặp tăng lên 10 triệu, dừng lại khi i >= N
int main(){
// Số lớn nhất mà kiểu dữ liệu số
// nguyên có thể chứa.
cout << INT_MAX << endl;
unsigned long N = 3000000000;
for(size_t i = 0; i < N; i += 10000000){
cout << i << endl;
}
}
Chương trình sau khi thay int
thành size_t
chạy ok cho tới khi i >= 3 tỉ
thì dừng, tương đương 300
vòng lặp.
Không những mặc định là unsigned int
, size_t
có thể tự động chuyển thành các kiểu dữ liệu không dấu khác như unsigned short
, unsigned char
, unsigned long
, unsigned long long
khi cần.
Source: http://wp.ftn61.com
Category: Tin Tức
Để lại một bình luận