Kích thước kiểu dữ liệu trong C

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 char có thể lưu trữ giá trị nhỏ hơn hoặc bằng 127;
  • Kiểu short intint có thể lưu trữ giá trị nhỏ hơn hoặc bằng 32767;
  • Kiểu long int có thể lưu trữ giá trị nhỏ hơn hoặc bằng 2147483647;
  • Kiểu char ít nhất có 8 bit, short intint ít nhất có 16 bit, còn long 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?

  1. 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
  1. 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òn uint8_t đại diện cho kiểu số nguyên không dấu 8 bit, tức là từ 0 đến 255.

Thẻ: C kích_thước_kiểu_dữ_liệu inttypes.h limits.h

Đăng vào ngày 20 tháng 5 lúc 17:56