Kann hier jemand C?

Gast #4502007
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?
Gast #4502041
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.)
#4502275
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.
Gast #4502503
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.
#4503059
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.
Gast #4503932
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.
Gast #4504096
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
Gast #4505451
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.
#4505478
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren