Trong C hoặc C++, có bốn kiểu dữ liệu khác nhau cho dữ liệu nguyên: short, int, long và long long. Mỗi kiểu chiếm dung lượng bộ nhớ khác nhau. Kích thước thay đổi tùy kiến trúc và hệ điều hành. Đôi khi int chiếm 4 byte, đôi khi 2 byte. Điều này cũng xảy ra với các trình biên dịch. Do đó có thể dùng cross compiler (biên dịch chéo).
Nếu biên dịch mã sau trên hệ thống 32-bit và 64-bit, sẽ cho kết quả khác nhau.
Ví dụ
#include <stdio.h>
int main() {
printf("Size of int : %ld Bytes\n", sizeof(int));
printf("Size of long : %ld Bytes\n", sizeof(long));
printf("Size of long long : %ld Bytes", sizeof(long long));
}
Kết quả (32-bit)
Size of int : 4 Bytes Size of long : 4 Bytes Size of long long : 8 Bytes
Kết quả (64-bit)
Size of int : 4 Bytes Size of long : 8 Bytes Size of long long : 8 Bytes
Từ ví dụ này dễ thấy kiểu long thay đổi tùy trình biên dịch. Nguyên nhân là gì?
CPU gọi dữ liệu từ bộ nhớ chính (RAM) bằng cách cung cấp địa chỉ của Thanh ghi địa chỉ bộ nhớ (MAR). Khi tìm thấy vị trí, dữ liệu chuyển đến Thanh ghi đệm bộ nhớ (MBR). Dữ liệu lưu vào thanh ghi CPU để dùng tiếp. Kích thước bus dữ liệu quyết định kích thước thanh ghi CPU. Với hệ 32-bit, chỉ gọi được 4 byte mỗi lần. Nếu dữ liệu lớn hơn 32-bit, cần hai chu kỳ. Với dữ liệu nhỏ thì không khác biệt.