Articles
Az EOF (fájl vége) karakter tárolása karaktertípusban
On február 18, 2021 by admin Olvastam a Dennis Ritchie-ben The C programozási nyelv könyvet, amelyet int
kell használni ahhoz, hogy egy változó megtartsa az EOF – -t, hogy az elég nagy legyen ahhoz, hogy el tudja tartani az EOF értékét – nem char
. De a következő kód jól működik:
#include<stdio.h> main() { char c; c=getchar(); while(c!=EOF) { putchar(c); c=getchar(); } }
Amikor van nincs több bemenet, az getchar
EOF értéket ad vissza. És a fenti programban a c
változó char típusúakkal képes megtartani sikeresen.
Miért működik ez? A fent említett könyv magyarázatának megfelelően a kódnak nem szabad működnie.
0xff
. Agetchar()
egyint
fájlban megoldja ezt a problémát. Kérdése lényegében megegyezik a comp.lang.c GYIK 12.1 kérdésével, amely kiváló forrás. (Ezenkívül amain()
int main(void)
értéknek kell lennie, és nem ártana 'return 0;
a záró}
előtt.)Úgy tűnik, hogy a kódod működik, mert az implicit típusú konverziók véletlenül helyesen cselekednek.
getchar()
visszaad egyint
értéket, amely vagy illeszkedik aunsigned char
tartományba, vagyEOF
( amelynek negatívnak kell lennie, általában -1). Ne feledje, hogy maga aEOF
nem karakter, hanem azt jelzi, hogy nincs több elérhető karakter.A a
c
részben két lehetőség van. Vagy achar
típus képviselheti az értéket, ebben az esetben ac
értéke. Vagy achar
típus nem képviselheti az értéket. Ebben az esetben nincs meghatározva, hogy mi fog történni. Az Intel processzorok csak levágják azokat a nagy biteket, amelyek nem illenek az új típusba (hatékonyan csökkentve a modulo 256 értékét achar
esetén), de nem szabad erre hagyatkozni.A következő lépés a
c
és aEOF
összehasonlítása. AhogyEOF
egyint
,c
konvertálódikint
-re is, megőrizve a tárolt értéket ac
mappában. Ha ac
tárolni tudná aEOF
értéket, akkor az összehasonlítás sikeres lesz , de ha ac
nem nem tárolhatja az értéket, akkor az összehasonlítás kudarcot vall, mert helyrehozhatatlan információvesztés történt a achar
beírásához.Úgy tűnik, hogy a fordító a
char
típust választotta aláírt és azEOF
értéke kicsi elég ahhoz, hogy beleférjenchar
. Ha achar
nem volt aláírva (vagy ha a következőt használta:unsigned char
), akkor a tesztje kudarcot vallott volna, mertunsigned char
nem tudja megtartani aEOF
értékét.Ne feledje, hogy van egy második probléma is a kódjával. Mivel
EOF
nem maga a karakter, dechar
típusba kényszeríted, nagyon valószínű, hogy van egy karakter, akit félreértelmeznekEOF
és a lehetséges karakterek fele esetében nincs meghatározva, hogy helyesen dolgozzuk-e fel őket.Megjegyzések
char
értékek beírásához aCHAR_MIN
.. tartományon kívül.CHAR_MAX
akarat szükséges mindkét hozamhoz egy megvalósítás által definiált érték, egy olyan bitmintát eredményez, amelyet a megvalósítás csapda reprezentációként határoz meg, vagy felvet egy megvalósítás által definiált jelet. A legtöbb esetben a megvalósításoknak sok extra munkán kell átesni, hogy két ' s-komplement redukción kívül bármi más elvégezhető legyen.Ha a Szabványügyi Bizottság tagjai egyetértenek azzal az elképzeléssel, hogy a fordítókat arra kell ösztönözni, hogy a legtöbb más fordító viselkedésével összhangban viselkedjenek, ellenkező okok hiányában …(signed char)x
egyértelműbbnek és pontosabbnak kell tekinteni biztonságos, mint((unsigned char)x ^ CHAR_MAX+1))-(CHAR_MAX+1)
.) Jelenlegi állapotom szerint nem látom ' annak valószínűségét, hogy a fordítók bármilyen más, ma megfelelnek a div div = “22a241b42f”>s szabvány; az egyetlen veszély az lenne, hogy a szabvány megváltozhatna, hogy megszakítsa a viselkedést az " optimalizálás feltételezett érdekében ".
int i=129; signed char c=i;
típusú kényszer. Viszonylag kevés processzor rendelkezik olyan utasítással, amelyc
-t egyenlővé tennéi
ha ' a -127 és +127 közötti tartományban, és következetes más térképezéseket eredményezne ai
egyéb értékekről a -128 és +127 közötti értékekre, amelyek eltérnek a két s-komplement csökkentés, vagy …