char array initialisieren
Verfasst: 02.11.2024, 19:30
Abend zusammen
Ich steh hier grad vor der Situation, dass ich gerne ein static char array initialisieren würde - mit Werten > 127.
Mein Textrenderer ist jetzt in den Grundzügen soweit fertig - und ich würde ihn auch dazu nutzen wollen, einige Rahmenelemente aus Codepage 850 (oder 437) darzustellen.
Für meine hübschen Menüs habe ich also ein static char array angelegt und initialisiere es mit den entsprechenden Werten für die Codepoints der Rahmenelemente.
Die Rahmen lassen sich so mit einem einfachen Texteditor zeichnen, den ich nur auf die entsprechende Codepage umschalten muss. So sehe ich gleich, was ich "zeichne".
Das Problem:
Ich kann die Codepoints später über einen Hexeditor nur als (positive) hexadezimale Zahlen exportieren - was ja soweit eigentlich auch ganz sinnvoll wäre. Nur ist halt das array vom typ char (und nicht unsigned char).
Bei der Initialisierung moniert jetzt der gcc die conversion an, von einer Zahl grösser als 127 zu char (die Codepoints der Rahmenelemente sind natürlich alle > 127).
Ich würde allerdings gerne für diverse Funktionen kompatibel zu char bleiben (Beispiel printf).
Notfalls kann ich natürlich einfach händisch auf negative Zahlen umrechnen. Wenn sich das allerdings irgendwie vermeiden lässt, wärs natürlich super!
Vielleicht habt ihr ja eine Idee dazu?
Interessantes Details (wie ich finde)
Bis vor kurzem dachte ich noch, dass folgende Anweisung aufgrund eines overflows UB wäre.
Das scheint aber tatsächlich gar nicht der Fall zu sein.
So wie ich das jetzt im C11 Standard gelesen und verstanden habe (genau genug beschreibt es leider keines meiner C Bücher) passiert folgendes:
bei der Addition von x und x, werden die beiden x zunächst zu int promoted, da immer mit (mindestens) int gerechnet wird.
der Ausdruck x + x ist also vom typ int.
Weiter wird jetzt eine implizite conversion vorgenommen vom typ int zu char. Solche conversions unter ganzzahligen Typen sind immer wohl definiert - und es macht dabei auch keinen Unterschied, ob ich diese explizit vornehme (cast) oder nicht.
Selbiges muss dann auch für folgende Anweisung gelten:
Die Zahlenkonstante 1 ist vom Typ int, wodurch x (ohnehin) zu int promoted wird.
Und konsequenterweise müsste dann auch folgendes "legal" sein (ich versuche es noch über den Standard zu verifizieren).
Folgendes aber dann tatsächlich UB, da einen Überlauf beim rechnen auftritt (und nicht bei der Zuweisung).
Ich steh hier grad vor der Situation, dass ich gerne ein static char array initialisieren würde - mit Werten > 127.
Mein Textrenderer ist jetzt in den Grundzügen soweit fertig - und ich würde ihn auch dazu nutzen wollen, einige Rahmenelemente aus Codepage 850 (oder 437) darzustellen.
Für meine hübschen Menüs habe ich also ein static char array angelegt und initialisiere es mit den entsprechenden Werten für die Codepoints der Rahmenelemente.
Die Rahmen lassen sich so mit einem einfachen Texteditor zeichnen, den ich nur auf die entsprechende Codepage umschalten muss. So sehe ich gleich, was ich "zeichne".
Das Problem:
Ich kann die Codepoints später über einen Hexeditor nur als (positive) hexadezimale Zahlen exportieren - was ja soweit eigentlich auch ganz sinnvoll wäre. Nur ist halt das array vom typ char (und nicht unsigned char).
Bei der Initialisierung moniert jetzt der gcc die conversion an, von einer Zahl grösser als 127 zu char (die Codepoints der Rahmenelemente sind natürlich alle > 127).
Code: Alles auswählen
overflow in conversion from 'int' to 'char' changes value from '128' to '-128'
Notfalls kann ich natürlich einfach händisch auf negative Zahlen umrechnen. Wenn sich das allerdings irgendwie vermeiden lässt, wärs natürlich super!
Vielleicht habt ihr ja eine Idee dazu?
Interessantes Details (wie ich finde)
Bis vor kurzem dachte ich noch, dass folgende Anweisung aufgrund eines overflows UB wäre.
Code: Alles auswählen
char x = 127;
char c = x + x; // OK. Implizit conversion from 'int' to 'char'
So wie ich das jetzt im C11 Standard gelesen und verstanden habe (genau genug beschreibt es leider keines meiner C Bücher) passiert folgendes:
bei der Addition von x und x, werden die beiden x zunächst zu int promoted, da immer mit (mindestens) int gerechnet wird.
der Ausdruck x + x ist also vom typ int.
Weiter wird jetzt eine implizite conversion vorgenommen vom typ int zu char. Solche conversions unter ganzzahligen Typen sind immer wohl definiert - und es macht dabei auch keinen Unterschied, ob ich diese explizit vornehme (cast) oder nicht.
Selbiges muss dann auch für folgende Anweisung gelten:
Code: Alles auswählen
char x = 127;
x = x + 1; // OK. Implizit conversion from 'int' to 'char'
Und konsequenterweise müsste dann auch folgendes "legal" sein (ich versuche es noch über den Standard zu verifizieren).
Code: Alles auswählen
char x = 127;
x += 1; // OK. Implizit conversion from 'int' to 'char'
Code: Alles auswählen
char x = 127;
x++; // OK. Implizit conversion from 'int' to 'char'
Code: Alles auswählen
char c = 1 + 2147483647; // UB. int overflow.