Tại sao ký tự 'A' được so sánh với 0x41?


89

Tôi đang xem một số mã C ++ và tìm thấy cấu trúc sau:

if('A' == 0x41) {
  // ...
} else if('A' == 0xc1) {
  // ...
} else {
  // ...
}

Tôi nhận được cảnh báo Visual Studio nói rằng:

Cảnh báo biểu thức điều kiện C4127 là hằng số.

Visual Studio rõ ràng là đúng - chắc chắn 'A' được định nghĩa là 0x41. Tại sao tác giả viết mã này, cho rằng hai trong ba nhánh là mã chết?


30
Chúng không nhất thiết phải là mã chết, có lẽ đó chỉ là một cách đơn giản để kiểm tra bộ ký tự.
George

60
'A' = C1 trong EBCDIC
harold

14
Tôi sẽ đặt nó trong một tiêu đề tiện ích là #define IS_CHSET_EBCDIC ('A' == 0xc1)vv; hoặc, trong C ++ hiện đại, hãy biến nó thành một constexpr.
Peter - Phục hồi Monica

8
@ b.buchhold - Không, bạn có thể biên dịch chéo từ PC sang máy tính lớn. Vì vậy, 'A' phải có nghĩa là giá trị của ký tự trong bộ ký tự thực thi.
Bo Persson

2
Có vẻ như điều này có thể được thực hiện tốt nhất bằng cách sử dụng bao gồm có điều kiện của bộ xử lý trước (ví dụ: #if 'a' == 41 ... #else ... #endif) để thực hiện việc này thay vì các nhánh động để bạn không nhận được các cảnh báo như thế này . Liệu điều đó có hiệu quả?
templatetypedef

Câu trả lời:


116

0xc1EBCDICmã bộ ký tự cho A. Tác giả đang thử nghiệm cho một chiếc máy như vậy.

http://www.ibm.com/support/knowledgecenter/en/SSGH4D_15.1.3/com.ibm.xlf1513.aix.doc/language_ref/asciit.html


14
"có cách nào tốt hơn cách này để kiểm tra bộ ký tự không?" Không có cách tiêu chuẩn để làm như vậy. Trong C11, có một cách để kiểm tra xem một số bảng mã Unicode nhất định đang được sử dụng hay không, nhưng MSVC thậm chí sẽ không hỗ trợ đầy đủ C99 (có trước C11). "Bộ ký tự thay thế này phổ biến làm sao!" Ngoài các máy tính lớn của IBM? Không có gì.

2
Vậy elsenhánh cuối cùng để làm gì? Có cách mã hóa ký tự vẫn đang sử dụng nào tương thích với cả ASCII và EBCDIC không?
dan04,

8
@ dan04 Tôi không biết gì, nhưng thực tế nó có thể đơn giản như một nhánh "mã hóa không xác định, thông báo lỗi in".

8
'A' cũng là 0xC1 trong mã hóa ký tự Apple II DOS 3.3, là ASCII HOẶC với 0x80.
Damian Yerrick

2
@Rhymoid Thực sự có khả năng Microsoft sẽ triển khai C11 trước khi hỗ trợ C99. Họ là một trong những nhà cung cấp đã đẩy lùi các tính năng khó triển khai của C99, hai trong số đó không còn bắt buộc trong C11 en.wikipedia.org/wiki/… .
Steve Cox

11

Ngay từ cái nhìn đầu tiên có thể giống như mã chết nhưng 'A' == 0x41 không phải lúc nào cũng trả về true ..

những gì nhà phát triển đã cố gắng làm ở đây là lười biếng tìm mã hóa mà máy đang triển khai ASCII hoặc bất kỳ biến thể nào của EBCDIC

như @Richard đã đề xuất Capital a được ánh xạ tới 0xc1 trong Mã trao đổi thập phân được mã hóa nhị phân quốc tế - mở rộng, xem bảng bên dưới trong nhánh 2 của if else ...

nhập mô tả hình ảnh ở đây

ASCII có thể tìm thấy một giá trị khác khác cho exmaple:

nhập mô tả hình ảnh ở đây

anh ấy cũng có thể đã làm:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}

Trong đoạn thứ hai - ý bạn là EBCDIC thay vì EBDIC?
Zze
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.