binär in dezimal (2´er komplement)



  • liebes forum, liebe experten 🙂
    ist wahrscheinlich für euch trivial, aber ich verzweifele:
    brauche nen c-prog, mit dem ich eine binärzahl (16bit, 2´er
    komplement (davon das zweite byte die nachkommastellen) in eine
    dezimalzahl umwandeln kann.

    ----------------------------------
    0001 1001 0001 0000 --> +25,0625
    1110 0110 1111 0000 --> -25,0625
    ----------------------------------

    habt ihr da ne lösung?
    gruss
    leidi



  • hi
    ich hab deine frage nicht ganz nachvollziehen koennen aber ich hab mal n stückchen code geschrieben vielleicht kannste damit was anfangen
    mfg

    linuxuser

    #include <stdio.h>
    int main(){
    	int lauf = 4;
    	int erg = 0;
    	char input[16];
    	int puffer = 1;
    	printf("Bitte geben Sie die Bitfolge ein...\n");
    	fgets(input, 18, stdin);
    	while(lauf >= 0){
    		puffer *= 2;
    		if(input[lauf] == '0'){
    			//do nix
    		}else{
    			erg += puffer;
    		}//end if
    		lauf--;
    	}//end while
    	printf("Ergebnis: %d\n", erg);
    }//end main
    


  • #include <stdio.h>
    
    int
    main ()
    {
      short x;
    
      x=0x1910;
      printf("%f\n",((double)x)/256);
    
      x=0xE5F0;
      printf("%f\n",((double)x)/256);
    
      return 0;
    }
    

    einfach nach float oder double konvertieren und durch 256 teilen 😃



  • Moin Moin!

    @linuxuser:
    sorry, dass ich deinen beitrag so unkommentiert stehen lasse, aber konfusius vorschlag sieht wesentlich einfacher aus 🙂

    @konfusius:
    wie geil ist das denn?!?!
    aber ich kapiere es nicht 😞
    wieso klappt es, wenn man den umgewandelten wert durch 256 dividiert? das grenzt für mich an hexerei



  • @konfutius
    was mahchst du da ich haette mir gedacht man muss die binaere zahl einlaesen?

    @sleit
    waenn du die sache etwas besser erklaerst koennte ich dir eine bessere loesung implementieren meine wandelt bis jetzt eine 16 bit zahl in einen int wert um...
    ps:warum sieht das von konfutius einfacher aus waenn du es nicht kapierst?????



  • @Konf... --linuxuser-- hat recht, dein Programm ist nicht die richtige lösung für die Aufgabe!
    Denn Hexadezimal ist nicht das gleiche wie Dual.

    mfg hohesC



  • dann versuche ich es ausführlich zu erklären:
    ich möchte eine temperatur über einen sensor (ds1721) auswerten. wenn ich es richtig verstanden habe, dann stellt mir der sensor einen messwert im hex oder bin format zur verfügung (bin mir nicht ganz sicher, ob der sensor beides zur verfügung stellt (datenblatt seite 4). er hat halt ein register 2 byte groß, darin wird der wert im 2´er komplement abgelegt. das register muß ich halt auslesen). diese werte muß ich dann umwandeln.

    das heißt, dass ich die möglichkeit von konf... doch gut verwenden kann, oder?



  • für alle die mehr über den DS1721 wissen wollen:
    http://pdfserv.maxim-ic.com/en/ds/DS1721.pdf
    waenn ich heute zuhause bin werde ich ein proggy schreiben die das auswertet aber jetzt hab ich noch deutsch...



  • --linuxuser-- schrieb:

    waenn ich heute zuhause bin werde ich ein proggy schreiben die das auswertet aber jetzt hab ich noch deutsch...

    Du bist nen Schatz. 😉



  • --linuxuser-- schrieb:

    ... aber jetzt hab ich noch deutsch...

    Schaden kann's ja nicht 😃

    *scnr*



  • #include <stdio.h> 
    enum BOOL {false, true};
    
     int main(){
    	 int vorz = false;
    	 int byte1 = 0;
    	 int byte2 = 0;
         int lauf = 7; 
         int erg = 0; 
         char input[16]; 
         int puffer = 1; 
         printf("Bitte geben Sie die Bitfolge ein...\n");
         fgets(input, 16, stdin);
         while(lauf >= 1){ 
             if(input[lauf] == '0'){ 
                 //do nix 
             }else{ 
                 erg += puffer; 
             }//end if
    		 puffer *= 2; 
             lauf--; 
         }//end while
    	 byte1 = erg;
    	 erg = 0;
    	 if(input[0] == '0') vorz = true;
    	 printf("Das ergebnis ist: ");
    	 if(vorz == true){
    	 	printf("+%d", byte1);
    	 }else{
    	 	printf("-%d", byte1);
    	 }//end if
    	 /*hier kann man dann die gleitkommazahl implementieren
    	 mit der mantisse und dem exponenten und kann das erg vom
    	 exponenten in byte2 speichern und dann muss man nur noch mit
    	 printf(".%d\n", byte2); den rest des ergebnises ausgeben
    	 ich will euch nicht den ganzen spass am proggen wegnehmen,
    	 also dann noch viel spass aber das von Konfusius kann auch
    	 funzeln denn der ds1721 liefert auch eine HEX zahl aber
    	 wem das programmieren spass macht nimmt meine lösung :-)))*/
     }//end main
    

    @TactX
    REIN IN DIE ANARCHIE DER WORTE



  • das mit dem dividieren funktioniert ganz einfach:

    du machst aus deiner festkommazahl eine ganzzahl, im dem du sie mit 256 multipliezierst. dann konvertierst du das ergebnis nach float un dividierst anschließend wieder durch 256. x*256/256=x.

    das multiplizieren mit 256 kannst du dir aber sparen. da du deine festkommazahl als short darstellst, in dem das high-byte die vorkommastellen und das low-byte die nachkommastellen sind, liest dein c-compiler deine festkommazahl so, als wäre sie bereits mit 256 multipliziert.

    also einfach nach float konvertieren und dann durch 256 dividieren.



  • #include <stdio.h> 
    enum BOOL {false, true};
    
     int main(){
    	 int vorz = false;
    	 int byte1 = 0;
    	 int byte2 = 0;
         int lauf = 7; 
         int erg = 0; 
         char input[16]; 
         int puffer = 1; 
         printf("Bitte geben Sie die Bitfolge ein...\n");
         fgets(input, 17, stdin);
    	 lauf = 0;
    	 while(lauf < 16){
    		 printf("%c", input[lauf]);
    		 lauf++;
    	 }//end while
    	 printf("\n");
    	 lauf = 7;
         while(lauf >= 1){ 
             if(input[lauf] == '0'){ 
                 //do nix
    			 printf("0");
             }else{ 
                 erg += puffer;
    			 printf("1");
             }//end if
    		 puffer *= 2; 
             lauf--; 
         }//end while
    	 byte1 = erg;
    	 puffer = 1;
    	 erg = 0;
    
    	 lauf = 15;
    	 while(lauf >= 8){ 
             if(input[lauf] == '0'){ 
                 //do nix
    			 printf("0");
             }else{ 
                 erg += puffer;
    			 printf("1");
             }//end if
    		 puffer *= 2; 
             lauf--; 
         }//end while
    	 byte2 = erg;
    	 erg = 0;
    	 	 if(input[0] == '0') vorz = true;
    	 printf("Das ergebnis ist: ");
    	 if(vorz == true){
    	 	printf("+%d", byte1);
    	 }else{
    	 	printf("-%d", byte1);
    	 }//end if
    	 short x = (short)byte2;
    	 printf("  %f\n",(x*256)*256/256);
     }//end main
    

    ja das mit dem umwandeln funtelt nur das zweite byte ist doof da weiß ich nicht wie ich das umwandeln soll 😞 vielleicht kann dir ein anderer dabei helfen
    die zeile

    printf("  %f\n",(x*256)*256/256);
    

    ist das ausschlaggebende....


Anmelden zum Antworten