https://github.com/GNOME/glib/blob/master/glib/gtypes.h #define G_MININT8 ((gint8) -0x80) Num haben sie ein Minus vor die hexadezimale Konstante gesetzt? Vor einem Jahr war das noch nicht da, bei glib 2.43.90 Mit Google finde ich dazu nichts, ich habe auch schon auf der gtk Mailingliste gefragt... Tippfehler, Neuerung in C?
Stefan S. schrieb: > Tippfehler, Neuerung in C? Keine Ahnung, aber dass die kleinstmögliche Zahl eines Zahlenformats eine negative Zahl ist, erscheint mir nicht so ganz unlogisch. Und für vorzeichenlose Zahlen wäre der kleinstmögliche Wert Null. Georg
Ah, für den GIR scanner. Der C Compiler wird dann wohl das gleiche Bitpattern verwenden, egal ob ein Minus vor der Hexadezimal-Konstante steht. (Zunächst hatte ich tatsächlich an eine Invertierung der Bits gedacht, aber das macht keinen Sinn.)
Stefan S. schrieb: > -0x80 Eigentlich steht da -128 das wird dann zum Bitpattern 0xffffff80 (weil er die -128 als int interpretiert). Und ganz zum Schluss wirds dann wieder zu einem int8 gecastet wobei die oberen 24 Bit wieder wegfliegen. Ich würds aber einfach als -128 lesen und mich nicht von der hexadezimalen Schreibweise verwirren lassen. DENN: Es ist REINER "ZUFALL" (naja, eigentlich eher besondere Umstände in diesem Einzelfall) daß das in der selben Bitfolge endet! Diese Schreibweise finde ich extrem verwirrend, ich hätte das wahrscheinlich anders hingeschrieben ums klarer zu machen. Bedenke zum Beispiel das:
1 | #define G_SECOND_MININT8 ((gint8) -0x7f)
|
das wäre dann im ersten Schritt 0xffffff81 und nach Wegwerfen der oberen 24 Bit bleibt noch 0x81 übrig, also hier wird dann aus -0x7f ein 0x81. Nur bei 0x80 ist es "zufällig" das selbe Bitmuster.
:
Bearbeitet durch User
Stefan S. schrieb: > Neuerung in C? Brandneu seit 1999 ist INT8_MIN aus stdint.h wenns sowas brauchst. Das obige Makro sieht eher nach glibc Interna aus.
Es hat damit zu tun dass wenn gint8 16bit ist, was ja seit geraumer Zeit möglich ist, dass dann diese Zahl nicht negativ ist und insofern die Vergleiche nicht mehr stimmen.
Bernd K. schrieb: > Stefan S. schrieb: >> -0x80 > > Eigentlich steht da > > -128 > > das wird dann zum Bitpattern 0xffffff80 (weil er die -128 als int > interpretiert). Und ganz zum Schluss wirds dann wieder zu einem int8 > gecastet wobei die oberen 24 Bit wieder wegfliegen. Genau genommen ist da nochmal ein weiterer Schritt drin. Erstmal wird das 0x80 als int mit dem Wert 128 interpretiert, dann negiert und dann erst gecastet. Negative Integerkonstanten gibt es in C nicht.
Danke für die Erklärungen. Auf der GTK Mailingliste hat sich bisher noch niemand gemeldet, da ist wirklich nicht mehr viel los.
Stefan Salewski schrieb: > Danke für die Erklärungen. Auf der GTK Mailingliste hat sich bisher noch > niemand gemeldet, da ist wirklich nicht mehr viel los. Versuch's mal im IRC, da ist wohl mehr los.
Rolf Magnus schrieb: > Negative Integerkonstanten gibt es in C nicht. ? Ich bin mir nicht sicher, ob ich Dich richtig verstehe. Was ist -1?
Rufus Τ. F. schrieb: > Rolf Magnus schrieb: >> Negative Integerkonstanten gibt es in C nicht. > > Was ist -1? Ein konstanter Ausdruck mit der Integerkonstante "1", die dann durch den unären Operator "-" verwurstet wird. C99 6.4.4.1 2 sagt: > An integer constant begins with a digit, but has no period or exponent > part. It may have a prefix that specifies its base and a suffix that > specifies its type.
:
Bearbeitet durch User
In den meisten Fällen sollte es auch keinen Unterschied machen. Einen Fall gibt es aber, nämlich wenn man INT_MIN direkt als Zahl hinschreibt. Da der entsprechende positive Wert nicht von int repräsentierbar ist, ist der Typ nicht int, wie man es vielleicht zunächst erwarten würde. Oder vielleicht etwas verständlicher per Beispiel: Auf einem avr mit seinen 16-Bit-int ist -32768 nicht etwa vom Typ int, sondern vom Typ long, da int zwar -32768 darstellen könnte, aber keine positiven 32768.
Selbst dieses Programm kommt auf -128
1 | #include <stdio.h> |
2 | |
3 | typedef signed char gint8; |
4 | #define G_MININT8 ((gint8) -0x80)
|
5 | |
6 | int main() |
7 | {
|
8 | printf("Wert G_MININT8 (dezimal): %d\n",G_MININT8); |
9 | printf("Wert 0x80 (dezimal): %d\n",0x80); |
10 | return 0; |
11 | }
|
12 | |
13 | // Wert G_MININT8 (dezimal): -128
|
14 | // Wert 0x80 (dezimal): 128
|
Der C-Hater flucht wie ein Fuhrknecht, hat aber, wenn man mal den letzten Absatz seines Textes hartverchromen läßt, vollkommen Recht. Ich weiß auch nicht, warum diese Massenpsychose, die die Leute masochistisch so eine Sprache erlernen läßt, noch immer anhält.
VEB Alligatorenfabrik schrieb: > Ich weiß auch nicht, warum diese Massenpsychose, die die Leute > masochistisch so eine Sprache erlernen läßt, noch immer anhält. Vielleicht man in der Sprache in solche implementierungsabhängigen Bereiche Vordringen kann. "Komfortable" können das nur, wenn deren Hersteller "Spracherweiterungen" anbringt, die dann natürlich was ganz Anderes sind.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.