2.2.1 Không phải chỉ có int là kiểu số nguyên (1)

Sẽ là rất tuyệt vời nếu các LTV có thể hoàn thành tốt các công việc của họ chỉ với kiểu int để làm việc với số nguyên, kiểu char để làm việc với các ký tự và float để làm việc với các tính toán dấu phẩy động ? Nhưng thật không may, nếu chỉ có một số ít kiểu dữ liệu như thế thì sẽ gây ra một số vấn đề.

Hầu hết các máy tính sử dụng hiện nay lưu trữ kiểu int bằng cách sử dụng 32 bits (4 bytes); Điều này có nghĩa là chúng ta có thể làm việc với các số nguyên trong khoảng [-2147483648 ~ 2147483647]. Nếu trong C++ chỉ có int là kiểu số nguyên thì có một số trường hợp như sau sẽ có thể xảy ra:

  • chúng ta không cần những giá trị lớn như vậy; giả sử nếu đếm cừu, chúng ta làm sao có đến 2 tỷ con, vậy tại sao phải lãng phí vậy tại sao phải lãng phí phần các bit trong số 32 bits nếu chúng ta không cần dùng chúng ?
  • chúng ta cần nhiều giá trị lớn hơn, ví dụ, nếu chúng ta dự định tính toán chính xác số người sống trên trái đất; trong trường hợp này chúng ta cần nhiều hơn 32 bits để có thể lưu được con số này
  • chúng ta chỉ cần hai giá trị khác nhau thể hiện các trạng thái on/off hoặc điều kiện true/false (mặc dù chúng ta có thể giả định cho chúng và sử dụng 1 là ‘on’ và 0 là ‘off’ chẳng hạn)
  • số người trên trái đất sẽ không bao giờ là số âm; có vẻ như có một sự lãng phí thật sự mà đến một nửa phạm vi cho phép sẽ không bao giờ được sử dụng

Với những lý do như vậy, ngôn ngữ C++ cung cấp một số phương pháp để lưu trữ các số lớn/nhỏ. Điều này cho phép trình biên dịch cấp phát bộ nhớ, hoặc nhỏ hơn bình thường (ví dụ như 16 bits thay vì 32) hoặc lớn hơn bình thường (ví dụ như 64 bits thay vì 32). Chúng ta cũng có thể tuyên bố rằng chúng ta đảm bảo rằng giá trị được lưu trữ trong các biến sẽ không âm. Trong trường hợp này, chiều rộng của phạm vi của biến không thay đổi, nhưng được dịch chuyển thành các số dương (tức là thay vì dãy số từ -2147483648 đến 2147483647 thì chúng ta có dãy số từ 0 đến 4294967295.

Để xác định yêu cầu về bộ nhớ, chúng ta có thể sử dụng một số từ khóa bổ sung, được gọi là modifiers:

  • long  – sử dụng để khai báo rằng chúng ta cần một phạm vi rộng hơn so với tiêu chuẩn;
  • short  – sử dụng để khai báo rằng chúng ta cần một phạm vi hẹp hơn so với tiêu chuẩn;
  • unsigned – được sử dụng để khai báo rằng một biến sẽ chỉ được sử dụng cho số không âm, bạn có thể thấy bất ngờ, nhưng chúng hoàn toàn có thể sử dụng modifiers cùng với kiểu char; chúng tôi sẽ giải thích nó ngay bây giờ.