int einerkomplement
-
Heyho,
Bin gerade dabei mich in C einzuarbeiten und schon die ersten kleinen Probleme^^
Wieso kommt, wenn ich ein unsigned int mit dem Wert 0 mit ~ negiere, -1 raus?
Bei long und long long das selbe.
Bei einem unsigned short klappt es. Da kommt dann 65535 raus.
-
Glaube ich so erstmal nicht. Show code.
-
SG1 schrieb:
Glaube ich so erstmal nicht. Show code.
Vermutlich
printf("%d",~(0u));
-
#include <stdio.h> int main() { unsigned int i = 0; i = ~i; printf("%d", i); return 0; }
Linux Ubuntu
Code::Blocks
GNU GCC Compiler
-
volkards Glaskugel funktioniert. Du suchst %u.
-
Habe auch schon gelesen, dass ~ die Variable in ein (signed) int umwandelt, aber da ich es wieder in nem unsigned int abspeicher und nicht sofort ausgebe sollte dies nicht das problem sein oder hab ich da was falsch verstanden?
-
Ah ok danke
komisch nur dasses bei short mit %d klappt
-
...
-
In einer Ellipse (wie auch in Funktionen ohne Parameterliste) werden die integer promotions auf alle Parameter angewendet, und floats werden zu doubles erweitert. Der Standard nennt das "default argument promotions."
Konkret bedeutet das: Wenn du einen Integertyp benutzt, der kürzer ist als int (genauer: dessen conversion rank geringer ist als der von int und unsigned int) und dessen gesamter Wertebereich durch int dargestellt werden kann, wird dieser zu int umgewandelt. Ist er kürzer als int und kann sein Wertebereich von int nicht komplett dargestellt werden, so wird er zu unsigned int umgewandelt.
Beispiel:
unsigned short s = 123; char c = 'A'; printf("%d\n", s); /* s wird hier befördert zu int. */ printf("%d\n", c); /* c wird hier befördert zu int. */
Interessanterweise ergibt sich daraus, dass
unsigned short s = 123; printf("%u\n", s); /* s wird hier (plattformabhängig) befördert zu int, nicht unsigned int! */
streng genommen einen unspezifizierten Wert ausgibt. In gleicher Weise ist die Ausgabe von
unsigned u = ~0u; // (unsigned) -1 printf("%d\n", u);
eigentlich unspezifiziert, obwohl ~0u == (unsigned) -1 (== UINT_MAX) garantiert ist. Hintergrund ist
int i = -1; unsigned u = (unsigned) -1; if(0 == memcmp(&i, &u, sizeof(int))) { puts("Zweierkomplementdarstellung wird benutzt."); } else { /* Dies ist vom Standard erlaubt, passiert aber auf heute gängigen Maschinen nicht. * Eine alte UNIVAC wäre hier tatsächlich vorbeigekommen. Aber das war vor unser aller Zeit. */ puts("Zweierkomplementdarstellung wird nicht benutzt."); }