Kích thước kiểu dữ liệu trong ngôn ngữ lập trình C
Khi thiết kế chương trình, cần chú ý đến các chi tiết kỹ thuật, đặc biệt là với ngôn ngữ có kiểu dữ liệu tĩnh như C. Một số lỗi tràn số xảy ra do không nắm rõ phạm vi giá trị của biến, vì vậy khi viết mã, cần phải cẩn thận.
Kích thước của kiểu số nguyên (integer) trong C
Kích thước của các kiểu dữ liệu trong C không cố định và phụ thuộc vào bộ biên dịch cũng như nền tảng sử dụng. Dưới đây là những điều chắc chắn:
- Kiểu
charcó thể lưu trữ giá trị nhỏ hơn hoặc bằng 127; - Kiểu
short intvàintcó thể lưu trữ giá trị nhỏ hơn hoặc bằng 32767; - Kiểu
long intcó thể lưu trữ giá trị nhỏ hơn hoặc bằng 2147483647; - Kiểu
charít nhất có 8 bit,short intvàintít nhất có 16 bit, cònlong intít nhất có 32 bit.
Làm thế nào để đảm bảo kích thước của các kiểu dữ liệu phù hợp với mong đợi?
- Xem xét thông tin về kích thước trên nền tảng cụ thể, theo tiêu chuẩn ANSI C, các thông tin này được định nghĩa trong file header
<limits.h>. Hoặc bạn có thể tự kiểm tra bằng cách chạy một chương trình mẫu sau:
#include <stdio.h>
int main() {
unsigned char szChar = sizeof(char);
unsigned char maxChar = (1 << (szChar * 8 - 1)) - 1;
unsigned short szShort = sizeof(short);
unsigned short maxShort = (1 << (szShort * 8 - 1)) - 1;
unsigned int szInt = sizeof(int);
unsigned int maxInt = (1U << (szInt * 8 - 1)) - 1;
unsigned long szLong = sizeof(long);
unsigned long maxLong = (1UL << (szLong * 8 - 1)) - 1;
printf("Kích thước char: %u\n", maxChar);
printf("Kích thước short: %u\n", maxShort);
printf("Kích thước int: %u\n", maxInt);
printf("Kích thước long: %lu\n", maxLong);
return 0;
}
Kết quả thực thi trên hệ thống 64-bit có thể sẽ là:
$ gcc demo.c -o kichthuoc
$ ./kichthuoc
Kích thước char: 127
Kích thước short: 32767
Kích thước int: 2147483647
Kích thước long: 9223372036854775807
- Trong C, thư viện
<inttypes.h>cung cấp các kiểu dữ liệu có kích thước cố định nhưint8_t,uint8_t,int16_t, v.v., giúp dễ dàng xác định các kiểu có độ dài 8, 16, 32, hoặc 64 bit. Ví dụ,int8_tđại diện cho kiểu số nguyên có dấu 8 bit, tức là từ -128 đến 127; cònuint8_tđại diện cho kiểu số nguyên không dấu 8 bit, tức là từ 0 đến 255.