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.
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.
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.
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.
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.
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.