Mengapa karakter 'A' dibandingkan dengan 0x41?

89

Saya melihat beberapa kode C ++ dan menemukan konstruksi berikut:

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

Saya mendapatkan peringatan Visual Studio yang mengatakan:

Peringatan Ekspresi bersyarat C4127 adalah konstan.

Visual Studio jelas benar - pasti 'A' didefinisikan sebagai 0x41. Mengapa penulis menulis kode ini, mengingat dua dari tiga cabang adalah kode mati?

H Bellamy
sumber
30
Itu belum tentu kode mati, mungkin itu hanya cara tolol untuk memeriksa kumpulan karakter.
George
60
'A' = C1 dalam EBCDIC
harold
14
Saya akan meletakkannya di tajuk utilitas sebagai #define IS_CHSET_EBCDIC ('A' == 0xc1)dll.; atau, dalam C ++ modern, jadikan sebagai constexpr.
Peter - Pulihkan Monica
8
@ b.buchhold - Tidak, Anda dapat mengkompilasi silang dari PC ke mainframe. Jadi 'A' harus berarti nilai karakter dalam set karakter eksekusi.
Bo Persson
2
Sepertinya ini paling baik dilakukan menggunakan inklusi bersyarat preprocessor (mis. #If 'a' == 41 ... #else ... #endif) untuk melakukan ini daripada cabang dinamis sehingga Anda tidak mendapatkan peringatan seperti ini . Apakah itu berhasil?
templatetypedef

Jawaban:

116

0xc1adalah EBCDICkode set karakter untuk A. Penulis sedang menguji mesin semacam itu.

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

Richard Hodges
sumber
14
"apakah ada cara yang lebih baik dari ini untuk memeriksa set karakter?" Tidak ada cara standar untuk melakukannya. Di C11, ada cara untuk memeriksa apakah pengkodean Unicode tertentu sedang digunakan, tetapi MSVC bahkan tidak akan sepenuhnya mendukung C99 (yang mendahului C11). "Seberapa umum set karakter alternatif ini!" Selain mainframe IBM? Tidak semuanya.
2
Jadi untuk apa elsecabang terakhir ? Apakah ada pengkodean karakter yang masih digunakan yang tidak kompatibel dengan ASCII maupun EBCDIC?
dan04
8
@ dan04 Tidak ada yang saya ketahui, tetapi secara realistis dapat sesederhana cabang "pengkodean tidak dikenal, cetak pesan kesalahan".
8
'A' juga 0xC1 dalam pengkodean karakter Apple II DOS 3.3, yang merupakan ASCII ATAU dengan 0x80.
Damian Yerrick
2
@Rhymoid Sebenarnya ada kemungkinan besar bahwa Microsoft akan mengimplementasikan C11 sebelum mendukung C99. Mereka adalah salah satu vendor yang menolak kesulitan dalam mengimplementasikan fitur C99, dua di antaranya tidak lagi wajib di C11 en.wikipedia.org/wiki/… .
Steve Cox
11

Pada pandangan pertama mungkin terlihat seperti itu adalah kode mati tetapi 'A' == 0x41 tidak selalu akan mengembalikan nilai true ..

apa yang pengembang coba lakukan di sini adalah dengan malas menemukan pengkodean apa yang mesin mengimplementasikan ASCII atau varian EBCDIC

karena @Richard menyarankan Modal a dipetakan ke 0xc1 dalam Kode Pertukaran Desimal Berkode Biner Internasional yang Diperluas lihat tabel di bawah di 2 cabang dari if else ...

masukkan deskripsi gambar di sini

nilai lain yang berbeda dapat ditemukan oleh ASCII sebagai contoh:

masukkan deskripsi gambar di sini

dia juga bisa melakukan:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}
ΦXocę 웃 Пepeúpa ツ
sumber
Di paragraf kedua - maksud Anda EBCDIC, bukan EBDIC?
Zze