Forum: PC-Programmierung Kann hier jemand C?


von Stefan S. (Gast)


Lesenswert?

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?

von Georg (Gast)


Lesenswert?

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

von Clemens L. (c_l)


Lesenswert?


von Stefan Salewski (Gast)


Lesenswert?

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

von Bernd K. (prof7bit)


Lesenswert?

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
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von chris (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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.

von Stefan Salewski (Gast)


Lesenswert?

Danke für die Erklärungen. Auf der GTK Mailingliste hat sich bisher noch 
niemand gemeldet, da ist wirklich nicht mehr viel los.

von Lukas K. (carrotindustries)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Negative Integerkonstanten gibt es in C nicht.

?

Ich bin mir nicht sicher, ob ich Dich richtig verstehe.

Was ist -1?

von Clemens L. (c_l)


Lesenswert?

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
von Rolf Magnus (Gast)


Lesenswert?

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.

von Wrumm (Gast)


Lesenswert?

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

von VEB Alligatorenfabrik (Gast)


Lesenswert?

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.

von Carl D. (jcw2)


Lesenswert?

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
Noch kein Account? Hier anmelden.