Trong loạt bài hướng dẫn này, chúng ta đã thảo luận về cách tạo và chạy chương trình C cơ bản, bộ tiền xử lý là gì cũng như kiến thức cơ bản về biến. Bây giờ chúng ta hãy đào sâu hơn một chút vào các biến và thảo luận về khía cạnh bộ nhớ.
Giả sử bạn đã xem qua tất cả các hướng dẫn của chúng tôi cho đến nay (hoặc bạn có kiến thức cơ bản cần thiết để hiểu hướng dẫn này), chúng ta hãy bắt đầu với một ví dụ mã đơn giản mà chúng tôi đã sử dụng trong một trong các hướng dẫn trước đây của mình.
Như bạn thấy, chương trình này tính giai thừa của một số do người dùng nhập vào.
Bây giờ, đối với các số nguyên nhỏ hơn như 5 hoặc 6, chương trình này sẽ hoạt động tốt - nó sẽ đưa ra kết quả giai thừa một cách chính xác. Nhưng, giả sử bạn thử nó cho số 13. Đây là kết quả bạn sẽ nhận được:
Nhưng điều đó không đúng vì giai thừa của 13 là6227020800. Vậy thì, câu hỏi tự nhiên là tại sao chương trình của chúng ta lại đưa ra câu trả lời sai? Vâng, câu trả lời nằm ở lượng bộ nhớ mà một biến int chiếm giữ trong hệ thống.
Trong hầu hết các hệ thống ngày nay, int chiếm 4 byte (hoặc 32 bit) bộ nhớ. Lưu ý rằng bạn có thể sử dụng dòng sau trong chương trình của mình để biết lượng byte mà int chiếm giữ trên hệ thống của bạn.
Và vì một biến int cũng có thể lưu trữ các giá trị âm, nên phạm vi giá trị mà nó có thể lưu trữ thay đổi từ-2.147.483.648 đến 2.147.483.647.
Bây giờ, vì giai thừa của 13 lớn hơn nhiều so với giá trị tối đa mà một biến int có thể chứa, nên chương trình của chúng ta đưa ra kết quả sai. Cách duy nhất để sửa lỗi chương trình là sử dụng một kiểu biến có khả năng lưu trữ6227020800.
Nếu bạn muốn lưu trữ một giá trị số nguyên dương lớn hơn, bạn có thể sử dụng 'unsigned int', có thể lưu trữ các giá trị trong phạm vi từ0 đến 4.294.967.295 (giả sử kiểu biến này chiếm 4 byte trên hệ thống của bạn). Nhưng ở đây, ngay cả 'unsigned int' cũng không hiệu quả vì giai thừa của 13 vượt quá khả năng tối đa của nó.
Vì vậy, vị cứu tinh của chúng ta ở đây sẽ là 'long long', chiếm 8 byte hoặc 64 bit bộ nhớ. Sau đây là chương trình đã sửa đổi:
Cách bạn làm cho printf hoặc scanf xác định biến 'long long' là sử dụng %lld (hoặc%I64d trong một số trường hợp). Đây là kết quả đầu ra mà chương trình đã sửa đổi này tạo ra:
Điều này đúng.
Vậy là giờ chúng ta đã biết giới hạn của 'int' và cách sử dụng 'unsigned int' và 'long long' để khắc phục hạn chế đó. Hãy nhớ rằng 'long; ' cũng là một kiểu biến nhưng trên hầu hết các hệ thống ngày nay, cả int và long đều chiếm 4 byte.
Ồ, và vâng, trong khi 'int', 'unsigned int' và 'long long' dành cho số nguyên, thì có 'float' và 'double' dành cho số dấu phẩy động. Float là 32 bit và có 7 chữ số thập phân có độ chính xác, trong khi double là 64 bit và có độ chính xác là 15 chữ số thập phân.
Việc đề cập đến số dấu phẩy động đưa tôi đến một điểm quan trọng khác ở đây. Nó liên quan đến phép chia. Hãy lấy một ví dụ mã C đơn giản để hiểu điều này.
Vì vậy, chương trình này không làm gì cả, ngoài việc chia a cho b hoặc 5 cho 10.
Trong thực tế, nếu bạn hỏi bất kỳ ai kết quả của 5/10, bạn sẽ nhận được 0,5 là câu trả lời trong phần lớn các trường hợp. Nhưng ở đây, câu trả lời sẽ là số không (0). Lý do là cả 'a' và 'b' đều là số nguyên, do đó kết quả phép chia của chúng cũng sẽ được coi là số nguyên, do đó phần dấu phẩy động sẽ bị bỏ qua.
Để giữ nguyên phần dấu phẩy động, bạn phải đảm bảo cả 'a' và 'b' đều là biến dấu phẩy động.
Trong trường hợp này, đầu ra sẽ là 0,5.
Trong hướng dẫn này, chúng ta đã thảo luận về kích thước biến và cách nó ảnh hưởng đến việc lưu trữ giá trị. Tôi hy vọng bạn đã có ý tưởng hay về cách và thời điểm sử dụng int, unsigned int, long long, float và double. Trong hướng dẫn tiếp theo, chúng ta sẽ thảo luận về các biến kiểu ký tự cũng như mảng.
Giả sử bạn đã xem qua tất cả các hướng dẫn của chúng tôi cho đến nay (hoặc bạn có kiến thức cơ bản cần thiết để hiểu hướng dẫn này), chúng ta hãy bắt đầu với một ví dụ mã đơn giản mà chúng tôi đã sử dụng trong một trong các hướng dẫn trước đây của mình.
Mã:
#include
int main (void)
{
int num = 0, temp=0;
printf("\n Nhập một số nguyên dương: ");
scanf("%d", &num);
temp = num;
int result = 1;
while (temp > 0)
{
result = result * temp;
temp = temp -1;
}
printf("\n Giai thừa của %d là %d\n", num, result);
return 0;
}
Bây giờ, đối với các số nguyên nhỏ hơn như 5 hoặc 6, chương trình này sẽ hoạt động tốt - nó sẽ đưa ra kết quả giai thừa một cách chính xác. Nhưng, giả sử bạn thử nó cho số 13. Đây là kết quả bạn sẽ nhận được:
Mã:
Giai thừa của 13 là 1932053504
Trong hầu hết các hệ thống ngày nay, int chiếm 4 byte (hoặc 32 bit) bộ nhớ. Lưu ý rằng bạn có thể sử dụng dòng sau trong chương trình của mình để biết lượng byte mà int chiếm giữ trên hệ thống của bạn.
Mã:
printf("\n int size in bytes is: %d ", sizeof (int));
Bây giờ, vì giai thừa của 13 lớn hơn nhiều so với giá trị tối đa mà một biến int có thể chứa, nên chương trình của chúng ta đưa ra kết quả sai. Cách duy nhất để sửa lỗi chương trình là sử dụng một kiểu biến có khả năng lưu trữ6227020800.
Nếu bạn muốn lưu trữ một giá trị số nguyên dương lớn hơn, bạn có thể sử dụng 'unsigned int', có thể lưu trữ các giá trị trong phạm vi từ0 đến 4.294.967.295 (giả sử kiểu biến này chiếm 4 byte trên hệ thống của bạn). Nhưng ở đây, ngay cả 'unsigned int' cũng không hiệu quả vì giai thừa của 13 vượt quá khả năng tối đa của nó.
Vì vậy, vị cứu tinh của chúng ta ở đây sẽ là 'long long', chiếm 8 byte hoặc 64 bit bộ nhớ. Sau đây là chương trình đã sửa đổi:
Mã:
#include
int main (void)
{
long long num = 0; long long temp=0;
printf("\n Nhập một số nguyên dương: ");
scanf("%d", &num);
temp = num;
long long result = 1;
while (temp > 0)
{
result = result * temp;
temp = temp -1;
}
printf("\n Giai thừa của %lld là %lld\n", num, result);
return 0;
}
Mã:
Giai thừa của 13 là 6227020800
Vậy là giờ chúng ta đã biết giới hạn của 'int' và cách sử dụng 'unsigned int' và 'long long' để khắc phục hạn chế đó. Hãy nhớ rằng 'long; ' cũng là một kiểu biến nhưng trên hầu hết các hệ thống ngày nay, cả int và long đều chiếm 4 byte.
Ồ, và vâng, trong khi 'int', 'unsigned int' và 'long long' dành cho số nguyên, thì có 'float' và 'double' dành cho số dấu phẩy động. Float là 32 bit và có 7 chữ số thập phân có độ chính xác, trong khi double là 64 bit và có độ chính xác là 15 chữ số thập phân.
Việc đề cập đến số dấu phẩy động đưa tôi đến một điểm quan trọng khác ở đây. Nó liên quan đến phép chia. Hãy lấy một ví dụ mã C đơn giản để hiểu điều này.
Mã:
int main (void)
{
int a=5, b=10;
printf("\n a/b is %d", a/b);
return 0;
}
Trong thực tế, nếu bạn hỏi bất kỳ ai kết quả của 5/10, bạn sẽ nhận được 0,5 là câu trả lời trong phần lớn các trường hợp. Nhưng ở đây, câu trả lời sẽ là số không (0). Lý do là cả 'a' và 'b' đều là số nguyên, do đó kết quả phép chia của chúng cũng sẽ được coi là số nguyên, do đó phần dấu phẩy động sẽ bị bỏ qua.
Để giữ nguyên phần dấu phẩy động, bạn phải đảm bảo cả 'a' và 'b' đều là biến dấu phẩy động.
Mã:
#include
int main (void)
{
float a=5, b=10;
printf("\n a/b is %f", a/b);
return 0;
}
Trong hướng dẫn này, chúng ta đã thảo luận về kích thước biến và cách nó ảnh hưởng đến việc lưu trữ giá trị. Tôi hy vọng bạn đã có ý tưởng hay về cách và thời điểm sử dụng int, unsigned int, long long, float và double. Trong hướng dẫn tiếp theo, chúng ta sẽ thảo luận về các biến kiểu ký tự cũng như mảng.