Problem mit Datentypen
-
Ich habe folgendes Prblem:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int main(void) { long zahl=0,i=0,a=0,b=0,c=0; char string[50]; printf("Zum Beenden 'q' druecken.\n\n"); printf("%d\n",sizeof(int));//4 Byte=32 Bit while(1) { printf("Bitte geben Sie eine Zahl ein:"); scanf("%s", string); if(strcmp(string,"q")==0) break; else zahl=atoi(string); if(zahl>4294967296)//integer constant too large type, dabei ist das 2^32 { printf("Die Zahl ist fuer 16 Bit zu gross\n"); exit(EXIT_FAILURE); } printf("\nDie Ausgabe ist:\n"); printf("Input\t Binary\t\t Hexadecimal\t Decimal\n"); //printf("%d\t ", zahl); while (i < 32) { a = zahl << i; b = a & 2147483648; c = b >> 32; //printf("%d", c); i = i+1; } i=0; //printf("\tOx%x", zahl); //printf("\t %d\n\n\n\n", zahl); } return 0; }
warum sagt sizeof mein int wäre 32 Bit lang, und wenn ich was mit der größten 32 Bit Zahl was machen will hab ich einen overflow?
-
1. Hast du da ein "long" aber das sei dir verziehen, viel schlimmer ist, dass es
2. signed ist also sein Wertebereich liegt nicht zwischen 0 und 4294967296, sondern zwischen -2147483648 und 2147483647. Zudem ist die Fehlermeldung mit 16Bit falsch, du schreibst doch selber, deine Variable ist 32Bit groß.Zudem wird "zahl" niemals > 4294967296 sein.
-
1. ist long signed und da ist eine Hälfte positiv, die andere negativ.
Bei 32 Bit geht das von -231 bis 231-1
2. Und das unsigned long geht von 0 bis 232-1Und wenn du wissen willst, wie das auf deinem System aussieht schau in der limits.h nach.
-
Und lies dir mal durch, was
atoi()
macht, wenn die Zahl im String zu groß/klein ist.
-
ok erstamsl danke,
aber warum geht dann das hier nicht:unsigned long int zahl=0,i=0,a=0,b=0,c=0; b = a & 2147483647;//right shift count >=width of type
was heist das?
-
Ich denke das der Fehler
"right shift count >=width of type"
eher in der Zeile darunter auftritt:c = b >> 32;
.
Du willst eine 32 Bit Zahl um 32 Stellen nach rechts verschieben.
Überleg mal was da übrig bleibt.Laut Babelfish heißt die Fehlermeldung: "Verschiebung nach rechts count >= Breite des Typs"
-
unsigned long long
<- Wurf.
-
Wenn du da jetzt noch weitermachst, solltest du bedenken, dass
atoi
auch nur int liefert, also signed.
Fürunsigned long
gibt esstrtoul()
.
Das setzt im Falle eines Überlaufs auch noch die globale Variableerrno
richtig.