Số nguyên là một kiểu số không có phần thập phân, nó có thể dương hay âm, bao gồm 0 (ví dụ: -2, -1, 0, 1, 2). C ++ có 4 loại số nguyên cơ bản khác nhau để sử dụng:
Type | Minimum Size | Note |
---|---|---|
short | 2 bytes | |
int | 2 bytes | Có thể 4 bytes tuỳ theo kiến trúc máy tính của bạn |
long | 4 bytes | |
long long | 8 bytes | Trong C99/C++11 |
Sự khác biệt chính giữa các kiểu số nguyên khác nhau là kích thước khác nhau của chúng – các số nguyên lớn hơn có thể chứa số lớn hơn.
C ++ chỉ đảm bảo rằng các số nguyên sẽ có kích thước tối thiểu nhất định là bao nhiêu đó, chứ không phải là chúng sẽ có kích thước cụ thể. Xem bài – Kích thước đối tượng và toán tử sizeof để biết thông tin về cách xác định độ lớn của từng kiểu dữ liệu trên máy của bạn.
Nội dung chính
1. Số nguyên có ký hiệu
Khi viết số âm trong cuộc sống hàng ngày, chúng ta sử dụng dấu âm. Ví dụ: -3 có nghĩa là âm 3. Dấu cộng để nhận biết số dương như +3 là số 3 (mặc dù quy ước chung cho rằng chúng ta thường bỏ qua các tiền tố cộng). Thuộc tính này là dương, âm hoặc bằng 0 được gọi là ký hiệu số.
Theo mặc định thì các số nguyên có ký hiệu, có nghĩa là ký hiệu cho thấy số đó là âm hay dương (và 0).
Trong bài học này, chúng ta sẽ tập trung vào các số nguyên có ký hiệu. Chúng ta sẽ thảo luận về các số nguyên không dấu (chỉ có thể giữ các số không âm) trong bài học tiếp theo.
2. Định nghĩa số nguyên có ký hiệu
Dưới đây là các cách được ưa thích để định nghĩa bốn loại số nguyên có ký hiệu:
short s;
int i;
long l;
long long ll;
Tất cả các số nguyên (trừ int) có thể có hậu tố int(có thể có or không):
short int si;
long int li;
long long int lli;
Hậu tố này không nên được sử dụng. Ngoài việc gõ nhiều hơn, việc thêm hậu tố int làm cho kiểu dữ liệu khó phân biệt với các biến của kiểu int. Điều này có thể dẫn đến sai lầm nếu dùng cho kiểu short hay long.
Các loại số nguyên cũng có thể dùng từ khóa signed(Có hay không đều được), theo quy ước thường được đặt trước tên kiểu dữ liệu:
signed short ss;
signed int si;
signed long sl;
signed long long sll;
Tuy nhiên, từ khóa này không nên được sử dụng, vì nó là dư thừa, vì các số nguyên mặc đinh đã có ký hiệu rồi.
3. Phạm vi số nguyên có ký hiệu
Như bạn đã học trong phần trước, một biến có n bit có thể chứa 2n giá trị khác nhau. Nhưng giá trị cụ thể nào? Chúng ta gọi tập hợp các giá trị cụ thể mà một kiểu dữ liệu có thể giữ là phạm vi của nó. Phạm vi của một biến số nguyên được xác định bởi hai yếu tố: kích thước của nó (tính bằng bit) và liệu nó có được ký hiệu hay không.
Theo định nghĩa, số nguyên có ký hiệu 1 byte sẽ có phạm vi từ -128 đến 127. Điều này có nghĩa là số nguyên có ký hiệu có thể lưu trữ bất kỳ giá trị số nguyên nào trong khoảng từ -128 đến 127 (đã bao gồm) một cách an toàn.
Trong toán học: một số nguyên 1 byte chứa 8 bit. 28 là 256, do đó, số nguyên 1 byte có thể chứa 256 giá trị khác nhau. Có 256 giá trị khác nhau trong khoảng từ -128 đến 127.
Tại đây, một bảng có chứa các số nguyên có ký hiệu và có kích thước khác nhau như sau:
Size/Type | Range |
---|---|
1 byte signed | -128 to 127 |
2 byte signed | -32,768 to 32,767 |
4 byte signed | -2,147,483,648 to 2,147,483,647 |
8 byte signed | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
Đối với toán học, một biến có ký hiệu n bit có phạm vi từ – (2n-1) đến 2n-1-1.
Đối với những người không thiên về toán học, hãy sử dụng bảng. 🙂
4. Tràn số nguyên
Điều gì xảy ra nếu chúng ta cố gắng gán giá trị 280 cho số nguyên có 1 byte? Số này nằm ngoài phạm vi mà số nguyên có 1 byte có thể giữ. Số 280 yêu cầu 9 bit (cộng 1 bit dấu) để được biểu diễn, nhưng chúng ta chỉ có 7 bit (cộng 1 bit dấu) có sẵn trong số nguyên có ký hiệu 1 byte.
Tràn số nguyên (thường được gọi là tràn số) xảy ra khi chúng ta cố gắng lưu trữ một giá trị nằm ngoài phạm vi của kiểu đó. Về cơ bản, số lượng chúng ta đang cố gắng lưu trữ đòi hỏi nhiều bit hơn để thể hiện so với đối tượng có sẵn. Trong trường hợp như vậy, dữ liệu bị mất vì đối tượng không có bộ nhớ đủ để lưu trữ mọi thứ.
Trong trường hợp số nguyên có ký hiệu, bit nào bị mất không được xác định rõ, do đó, tràn số nguyên có ký hiệu dẫn đến hành vi không xác định.
Nói chung, tràn kết quả để thông tin bị mất thì điều này gần như không một ai mong muốn. Nếu có bất kỳ nghi ngờ nào về việc một đối tượng có thể cần lưu trữ một giá trị nằm ngoài phạm vi của nó, hãy sử dụng một kiểu dữ liệu có phạm vi lớn hơn!
5. Chia số nguyên
Khi chia hai số nguyên, C ++ hoạt động giống như bạn mong đợi khi thương số là một số nguyên:
#include <iostream>
int main()
{
std::cout << 20 / 4;
return 0;
}
Điều này tạo ra kết quả mong đợi:
5
Nhưng hãy xem những gì xảy ra khi phép chia số nguyên dưới đây cho ra phân số:
#include <iostream>
int main()
{
std::cout << 8 / 5;
return 0;
}
Điều này tạo ra một kết quả có thể bất ngờ:
1
Khi thực hiện phép chia với hai số nguyên (được gọi là phép chia số nguyên), C ++ luôn tạo ra kết quả số nguyên. Vì các số nguyên không giữ các giá trị phân số, nên bất kỳ phần phân số nào cũng bị bỏ đi(làm tròn).
Nhìn kỹ hơn vào ví dụ trên, 8/5 tạo ra giá trị 1.6. Phần phân số (0,6) bị loại bỏ và kết quả của 1 vẫn còn.
Tương tự, -8 / 5 kết quả trong giá trị -1.
Lưu ý: Hãy cẩn thận khi sử dụng phép chia số nguyên, vì bạn sẽ mất bất kỳ phần phân số của thương số. Tuy nhiên, nếu nó là những gì bạn muốn thì chia số nguyên sẽ an toàn để sử dụng, vì kết quả có thể dự đoán được.
[…] Trong bài học trước (Số nguyên có ký hiệu(có dấu) hay còn gọi là số nguyên), chúng ta đã đề cập đến các số nguyên có ký hiệu, là một tập hợp các kiểu dữ liệu có thể chứa các số nguyên dương và âm, bao gồm 0. […]
Bình luận bị đóng.