Sử dụng unsigned char
"luôn luôn" có thể cung cấp cho bạn một số bất ngờ thú vị , như phần lớn các chức năng kiểu C như printf
, fopen
, sẽ sử dụng char
, không phải unsigned char
.
chỉnh sửa: Ví dụ về "vui vẻ" với các chức năng C-style:
const unsigned char *cmd = "grep -r blah *.txt";
FILE *pf = popen(cmd, "r");
sẽ cung cấp cho các lỗi (trong thực tế, tôi nhận được một cho dòng *cmd =
, và một lỗi cho các dòng popen
). Sử dụng const char *cmd = ...
sẽ hoạt động tốt. Tôi nhặt popen
bởi vì nó là một chức năng đó không phải là tầm thường để thay thế với một số tiêu chuẩn C++ chức năng - rõ ràng, printf
hoặc fopen
có thể khá dễ dàng được thay thế bằng một số chức năng iostream
hoặc fstream
loại, mà thường có lựa chọn thay thế mà phải mất unsigned char
cũng như char
.
Tuy nhiên, nếu bạn đang sử dụng >
hoặc <
trên ký tự vượt quá 127, sau đó bạn sẽ cần phải sử dụng unsigned char
(hoặc một số giải pháp khác, chẳng hạn như đúc để int
và mặt nạ 8 bit thấp hơn).Nó có lẽ là tốt hơn để cố gắng tránh so sánh trực tiếp (đặc biệt là khi nói đến các ký tự không phải ASCII - chúng vẫn lộn xộn, bởi vì thường có một số biến thể tùy thuộc vào ngôn ngữ, mã hóa ký tự, vv). So sánh bình đẳng nên làm việc tuy nhiên.
Nguồn
2013-08-14 00:23:56
@MitchWheat: Có. Ví dụ tôi đã gặp phải: Cray T90, Cray SV1, Cray T3E, SGI MIPS IRIX, IBM PowerPC AIX. Và bất kỳ hệ thống nào sử dụng EBCDIC khá nhiều đều phải làm đơn giản 'char' unsigned. –
@KeithThompson: Bạn nên thêm danh sách của mình làm câu trả lời cho [câu hỏi này] (http://stackoverflow.com/questions/3728045/any-compiler-which-takes-char-as-unsigned) – jxh
Bạn đọc tài liệu của trình biên dịch . –