Sai lầm kéo dài 5 năm: Tại sao ngôn ngữ C3 từ bỏ kích thước không dấu (Unsigned)?

02 tháng 5, 2026·4 phút đọc

Ngôn ngữ lập trình hệ thống C3 đã quyết định chuyển đổi từ sử dụng kích thước không dấu (unsigned) sang có dấu (signed) mặc định cho các chỉ số và độ dài. Bài viết này phân tích những cạm bẫy tinh vi của số nguyên không dấu trong các phép tính so sánh và số học, giải thích lý do tại sao lựa chọn có dấu lại an toàn và trực quan hơn.

Sai lầm kéo dài 5 năm: Tại sao ngôn ngữ C3 từ bỏ kích thước không dấu (Unsigned)?

C3 là một ngôn ngữ lập trình hệ thống thuộc dòng họ C, được thiết kế để mang lại hiệu suất cao nhưng hiện đại hơn. Trong suốt 5 năm phát triển, C3 đã sử dụng các kiểu kích thước không dấu (unsigned) làm mặc định. Tuy nhiên, gần đây nhóm phát triển đã quyết định đảo ngược triết lý này, chuyển sang sử dụng số có dấu (signed) cho các kích thước và độ dài. Đây là một sự thay đổi lớn, nhưng nó xuất phát từ những bài học thực tế đau xót về tính an toàn của phần mềm.

Tại sao số không dấu lại gây ra vấn đề? Về mặt lý thuyết, kích thước hoặc độ dài không bao giờ âm, nên việc sử dụng unsigned có vẻ hợp lý. Tuy nhiên, thực tế lập trình lại phức tạp hơn nhiều. Cạm bẫy nổi tiếng nhất là các vòng lặp vô tận hoặc các phép so sánh bị lỗi do quy tắc chuyển đổi kiểu. Ví dụ, trong C và C++, khi so sánh một số có dấu với một số không dấu, số có dấu sẽ bị chuyển đổi thành không dấu. Nếu số có dấu đó là âm, nó sẽ trở thành một giá trị dương cực lớn, làm sai lệch hoàn toàn logic so sánh.

C3 đã cố gắng giải quyết vấn đề này bằng cách cho phép chuyển đổi ngầm định an toàn giữa số có dấu và không dấu. Họ giả định rằng với các phép cộng, trừ, nhân, việc này vẫn an toàn nếu số nguyên sử dụng dạng bù 2 (two's complement). Mọi thứ dường như hoạt động trơn tru trong 5 năm cho đến khi một trường hợp sử dụng với toán tử lấy phần dư (%) bộc lộ lỗ hổng.

Vấn đề nằm ở chỗ, khi thực hiện phép tính như (foo + a) % 2, nếu foo là một số không dấu lớn, kết quả có thể trở nên vô lý. Việc chuyển đổi ngầm định từ không dấu sang có dấu trong các biểu thức phức tạp tạo ra những hành vi khó dự đoán mà ngay cả trình biên dịch cũng khó cảnh báo. Một ví dụ điển hình là khi tính toán offset cho một bộ đệm vòng (ring buffer). Với số không dấu, việc xử lý các offset âm trở nên cực kỳ phức tạp và dễ sai sót, trong khi số có dấu xử lý việc này một cách tự nhiên và trực quan.

Nhìn lại lịch sử, việc C chuẩn hóa sizeof trả về kiểu size_t (không dấu) đã vô tình đưa số học không dấu trở nên phổ biến, kéo theo hàng loạt lỗi khó chịu. Ngôn ngữ Java đã phản ứng quyết liệt vào những năm 90 bằng cách loại bỏ hoàn toàn kiểu không dấu để tránh các lỗi này. Ngay cả Go – một ngôn ngữ hệ thống hiện đại do các cựu kỹ sư của Google tạo ra – cũng chọn số có dấu làm mặc định cho kích thước, hiểu rõ chi phí mà số không dấu mang lại.

Một lập luận thường thấy ủng hộ số không dấu là phạm vi giá trị lớn gấp đôi. Tuy nhiên, thực tế cho thấy mã lệnh hoạt động ở vùng trên giới hạn của số có dấu (INT_MAX) thường chứa rất nhiều lỗi. Hơn nữa, tràn số (overflow) ở số không dấu thường tạo ra một kết quả dương "có vẻ hợp lý" nhưng lại sai hoàn toàn, khiến việc phát hiện lỗi trở nên khó khăn hơn so với tràn số ở số có dấu (thường tạo ra số âm).

Cuối cùng, C3 đã thực hiện bước ngoặt được gọi là "szmageddon", chuyển đổi kiểu mặc định cho kích thước từ usz (unsigned size) sang sz (signed size). Quyết định này đồng nghĩa với việc loại bỏ các chuyển đổi ngầm định giữa có dấu và không dấu. Kết quả là mã nguồn trở nên đơn giản hơn, dễ suy luận logic hơn và an toàn hơn. Nhà sáng lập C3 thừa nhận rằng việc giữ mãi thói quen dùng số không dấu là một sai lầm kéo dài, và việc thay đổi sang số có dấu mặc dù ban đầu có cảm giác "sai quy tắc", nhưng lại mang lại sự chính xác mà lập trình viên cần.

Đối với cộng đồng lập trình viên, đặc biệt là những người làm việc với ngôn ngữ cấp thấp như C, C++ hay Rust, bài học từ C3 là một lời nhắc nhở quan trọng: Đừng để sự "chính xác về mặt toán học" (kích thước không thể âm) làm lu mờ tính thực tế và an toàn trong thiết kế ngôn ngữ và hệ thống.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗