dezimal in dual - rechner



  • Hallo Zusammen,

    So, hier bin ich wieder. Diesmal muss ich einen Rechner programmieren,
    der Dezimal(mit 16bit darstellbar) in Dualzahlen umwandelt.
    Das Programm habe ich mit ideone laufen lassen und es funktioniert sogar,
    aber bei der Ausgabe stehen dann immer 16Bits.
    Wie schaffe ich es dass nur die benötigten bits ausgegeben werden?

    #include <stdio.h>
    
    int main(void) {
    
    int bits[16], i, dezzahl;
    
    //Dezimalzahleingabe
    printf("Bitte eine Zahl zwischen -32768 und + 32767 eingeben.\n");
    
    scanf(" %d\n", &dezzahl);
    
    //Überprüfung
    if(dezzahl<-32768 || dezzahl>32767) {
    	printf("\nUNgültige Eingabe!\n");
    	exit(0);
    } else {
    	printf("\nDanke für die Eingabe!\n");
    }
    
    //Schleife für Bits
    for(i=0; i<16; i++) {
    	bits[i] = dezzahl%2;
    	dezzahl = dezzahl/2;
    }
    
    for(i=16; i>0; i--) {
    	printf("%d", bits[i-1]);
    }
    
    	return 0;
    }
    


  • ein.neuling schrieb:

    Wie schaffe ich es dass nur die benötigten bits ausgegeben werden?

    Indem du dir merkst, bei welchem i bei der Berechnung der Bits dezzahl gleich 0 wird und dann die Ausgabe ab diesem i beginnst.

    Sonst:
    Wofür das Leerzeichen und das Newline im scanf() -Formatstring?
    Es fehlt <stdlib.h> für exit() . Warum überhaupt exit() und nicht einfach ein return EXIT_FAILURE; ?
    Der else -Zweig ist überflüssig.
    Vierergruppen bei der Ausgabe wäre übersichtlicher.

    Aja, für negative Eingaben ist dein Code übrigens kaputt.

    Mein Vorschlag (auch wenn mich einige für ?: wieder hauen werden ...):

    #include <stdint.h>
    #include <stddef.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    int main( void )
    {
    	int32_t input;
    	int bits[ 16 ];
    	size_t i;
    
    	printf( "Bitte eine Zahl zwischen %+d und %+d eingeben: ", INT16_MIN, INT16_MAX );
    
    	if( scanf( "%d", &input ) != 1 || input < INT16_MIN || INT16_MAX < input ) {
    		fputs( "Ungueltige Eingabe!\n\n", stderr );
    		return EXIT_FAILURE;
    	}
    
    	printf( "Binaer: %s", input < 0 ? "- " : "" );
    
    	for( i = 0; i < 16 && input; ++i ) {
    		bits[ i ] = (uint32_t) input % 2;
    		input /= 2;
    	}
    
    	while( i-- )
    		printf( "%d%s", bits[ i ], i % 4 ? "" : " " );
    
    	puts( "\n" );
    }
    


  • -710 ist entweder -1112 oder 11111111111110012 (bei 16 Bit- Zweierkomplement)

    Aber nicht -11111111111110012

    Demnach ist die Ausgabe vom Vorzeichen nicht nötig, bzw. muss dann der Betrag ausgegeben werden.



  • DirkB schrieb:

    -710 ist entweder -1112 [...]

    Ähm ... geau das macht mein Code?



  • Indem du dir merkst, bei welchem i bei der Berechnung der Bits dezzahl gleich 0 wird und dann die Ausgabe ab diesem i beginnst.

    Danke für die Tipps und den Vorschlag, ich werde alles nochmal genau durchgehen.

    Wofür das Leerzeichen und das Newline im scanf()-Formatstring?
    Es fehlt <stdlib.h> für exit(). Warum überhaupt exit() und nicht einfach ein return EXIT_FAILURE;?

    Das mit dem Leerzeichen war so in der Aufgabenstellung vorgegeben,
    return EXIT_FAILURE; hab ich noch nicht gekannt.


Log in to reply