Tất cả các kiểu số trong C++ có thể có dấu (signed) hoặc không dấu (unsigned). Ví dụ, bạn có thể khai báo int chỉ biểu diễn số nguyên dương. Mặc định, tất cả kiểu số nguyên là signed (có thể dương hoặc âm). Từ khóa unsigned dùng để khai báo biến không dấu.
Ví dụ
#include <iostream>
using namespace std;
int main() {
unsigned int i = -1; // Gán -1 cho unsigned int
int x = i; // Chuyển ngầm sang signed int
cout << i << ", " << x;
return 0;
}
Kết quả đầu ra
4294967295, -1
Giải thích
Khi gán -1 cho unsigned int, giá trị bị tràn (overflow): tất cả bit 0 biến thành 1, cho ra giá trị lớn nhất của kiểu 32-bit unsigned (2^32 - 1 = 4294967295). Biến x là signed int nên giữ giá trị -1.
Khi nào dùng unsigned?
- Khi giá trị không bao giờ âm (ví dụ: kích thước mảng, chỉ số, số lượng).
- Khi cần phạm vi dương lớn hơn (gấp đôi so với signed cùng kích thước).
- Thao tác bitwise (dịch bit, mask) an toàn hơn trên unsigned.
Cảnh báo
Tránh so sánh signed và unsigned trực tiếp – có thể dẫn đến hành vi không mong muốn do chuyển đổi ngầm. Bật cảnh báo -Wsign-compare (GCC/Clang) hoặc /W4 (MSVC).