Neden 'A' karakteri 0x41 ile karşılaştırılsın?


89

Bazı C ++ kodlarına bakıyordum ve aşağıdaki yapıyı buldum:

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

Şunları söyleyen bir Visual Studio uyarısı alıyorum:

Uyarı C4127 koşullu ifade sabittir.

Visual Studio açıkça haklıdır - kesinlikle 'A' 0x41 olarak tanımlanmıştır. Üç daldan ikisinin ölü kod olduğu düşünüldüğünde, yazar neden bu kodu yazıyor?


30
Mutlaka ölü kod değiller, belki de karakter kümesini kontrol etmenin aptalca bir yoludur.
George


14
Bunu bir yardımcı program başlığına #define IS_CHSET_EBCDIC ('A' == 0xc1)vb. Koyardım; veya modern C ++ 'da bunu bir constexpr.
Peter - Monica'yı Yeniden

8
@ b.buchhold - Hayır, bir bilgisayardan ana bilgisayara çapraz derleme yapabilirsiniz. Bu nedenle 'A', yürütme karakter kümesindeki karakterin değeri anlamına gelmelidir.
Bo Persson

2
Bu, dinamik dallar yerine önişlemci koşullu dahil etme (ör. #İf 'a' == 41 ... #else ... #endif) kullanılarak en iyi şekilde yapılabilir, böylece böyle uyarılar almazsınız . Işe yarar mı?
templatetypedef

Yanıtlar:


117

0xc1için EBCDICkarakter seti kodudur A. Yazar böyle bir makine için test yapıyor.

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


14
"Karakter kümesini kontrol etmenin bundan daha iyi bir yolu var mı?" Bunu yapmanın standart bir yolu yoktur. C11'de, belirli Unicode kodlamalarının kullanılıp kullanılmadığını kontrol etmenin bir yolu vardır, ancak MSVC, C99'u (C11'den önce) tam olarak desteklemeyecektir bile. "Bu alternatif karakter kümesi ne kadar yaygındır!" IBM ana bilgisayarları dışında? Bir şey değil.

2
Peki son elsedal ne için? Ne ASCII ne de EBCDIC ile uyumlu, hala kullanımda olan bir karakter kodlaması var mı?
dan04

8
@ dan04 Bildiğim kadarıyla hiçbiri, ancak gerçekçi bir "bilinmeyen kodlama, yazdırma hata mesajı" dalı kadar basit olabilir.

8
'A' aynı zamanda Apple II DOS 3.3 karakter kodlamasında 0xC1'dir ve ASCII OR'd ve 0x80'dir.
Damian Yerrick

2
@Rhymoid Aslında, Microsoft'un C99'u desteklemeden önce C11'i uygulaması için iyi bir şans var. Uygulanması zor C99 özelliklerine karşı geri adım atan satıcılardan biriydi, bunlardan ikisi artık C11 en.wikipedia.org/wiki/… 'de zorunlu değildir .
Steve Cox

11

İlk bakışta bu ölü kod gibi görünebilir ama 'A' == 0x41 her zaman doğru dönmeyecektir ..

geliştiricinin burada yapmaya çalıştığı şey, ASCII'yi veya ASCII'nin herhangi bir varyantını uygulayan makinenin hangi kodlamayı EBCDIC

@Richard Capital önerildiği gibi bir eşleştirilmiş 0xc1 yılında Uluslararası - Genişletilmiş ikili kodlanmış ondalık değişim kodu eğer başka 2 dalında aşağıdaki tabloya bakınız ...

görüntü açıklamasını buraya girin

Başka bir farklı değer, örneğin ASCII tarafından bulunabilir:

görüntü açıklamasını buraya girin

o da yapabilirdi:

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

İkinci paragrafta - EBDIC yerine EBCDIC'i mi kastettiniz?
Zze
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.