2
Kiểu dữ liệu size_t trong C++ là gì?
1
Xuân Trường20 đã đăng:

thêm bình luận...
4
trungkfc02570 đã đăng:

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 <iostream>
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,

Kiểu dữ liệu size_t trong C

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.

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 <iostream>
#include <limits>
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 <iostream>
#include <limits>
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.

đã bổ sung 5.8 năm trước bởi
Avatar: trungkfc02 trungkfc02570
thêm bình luận...
1
Tuấn Long80 đã đăng:

Kiểu dữ liệu size_t là kiểu dữ liệu không dấu đại diện chung cho tất cả các kiểu dữ liệu không dấu khác, giá trị của nó phụ thuộc vào từng chương trình môi trường hệ điều hành cụ thể, mục đích của nó là giúp lập trình viên không cần quan tâm đến vấn đề nên sử dụng dữ liệu cụ thể nào cho đúng như unsigned int hay unsigned long, ...v.v.

đã bổ sung 5.8 năm trước bởi
Avatar: Tuấn Long Tuấn Long80
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)