Code: Alles auswählen
// Also, ich bin jetzt so weit gekommen. Da ist ein Fehler drin
#include <stdio.h>
int main (void) {
float a;
int i;
printf ("%i\n", sizeof(a));
a = 543.75;
for (i = 0; i < 32; i++)
printf ("%i", (((unsigned short int)*(&a)) >> (31-i)) & 0x01);
return 0;
}
/* f = (-1)^s * 1.m * 2^(e-b)
* -543.75
* 543 / 2 = 271 Rest 1
* 271 / 2 = 135 Rest 1
* 135 / 2 = 67 Rest 1
* 67 / 2 = 33 Rest 1
* 33 / 2 = 16 Rest 1
* 16 / 2 = 8 Rest 0
* 8 / 2 = 4 Rest 0
* 4 / 2 = 2 Rest 0
* 2 / 2 = 1 Rest 0
* 1 / 2 = 0 Rest 1
*
* 10.0001.1111
*
* 0.75 * 2 = 1.5 1
* 0.5 * 2 = 1 1
*
* 10.0001.1111.11
* 1,000.0111.1111
* Jetzt zunächst Ohne Vorzeichen. das Komma um 9 Stellen verschoben
* 127 + 9 = 136
*
* 136 / 2 = 68 Rest 0
* 68 / 2 = 34 Rest 0
* 34 / 2 = 17 Rest 0
* 17 / 2 = 8 Rest 1
* 8 / 2 = 4 Rest 0
* 4 / 2 = 2 Rest 0
* 2 / 2 = 1 Rest 0
* 1 / 2 = 0 Rest 1
*
* 1000.1000
*
* 0 | 1000.1000 | 10.0001.1111.11
*/
Weil, nachdem ich den Wert vor dem Komma änderte, änderte sich die Darstellung, als ich danach etwas änderte nicht.
Code: Alles auswählen
// Ok, dieses Programm tut besser
#include <stdio.h>
#include <string.h>
int main (void) {
float a;
int i;
char s[sizeof(float)];
printf ("%i\n", sizeof(a));
a = (float)543.75;
memcpy(s, &a, sizeof(a));
for (int i = 0; i < sizeof(float); ++i)
printf("%x", s[i]);
return 0;
}
/* f = (-1)^s * 1.m * 2^(e-b)
* -543.75
* 543 / 2 = 271 Rest 1
* 271 / 2 = 135 Rest 1
* 135 / 2 = 67 Rest 1
* 67 / 2 = 33 Rest 1
* 33 / 2 = 16 Rest 1
* 16 / 2 = 8 Rest 0
* 8 / 2 = 4 Rest 0
* 4 / 2 = 2 Rest 0
* 2 / 2 = 1 Rest 0
* 1 / 2 = 0 Rest 1
*
* 10.0001.1111
*
* 0.75 * 2 = 1.5 1
* 0.5 * 2 = 1 1
*
* 10.0001.1111.11
* 1,000.0111.1111
* Jetzt zunächst Ohne Vorzeichen. das Komma um 9 Stellen verschoben
* 127 + 9 = 136
*
* 136 / 2 = 68 Rest 0
* 68 / 2 = 34 Rest 0
* 34 / 2 = 17 Rest 0
* 17 / 2 = 8 Rest 1
* 8 / 2 = 4 Rest 0
* 4 / 2 = 2 Rest 0
* 2 / 2 = 1 Rest 0
* 1 / 2 = 0 Rest 1
*
* 1000.1000
*
* 0 | 1000.1000 | 10.0001.1111.11
*/
Nein, ich habe die Musterlösung
Es kommt einen deut was anderes raus, als mein C Programm sagt.
Ach, so jetzt weiss ich wo der Fehler ist, die führende 1 muss nicht dargestellt werden, das war der Fehler.
Code: Alles auswählen
/ * Das entspricht etwa, dem, was in der Lösung steht */
#include <stdio.h>
#include <string.h>
int main (void) {
float a;
int i;
char s[sizeof(float)];
printf ("%i\n", sizeof(a));
a = (float)543.75;
memcpy(s, &a, sizeof(a));
for (int i = 0; i < sizeof(float); ++i)
printf("%x", s[i]);
return 0;
}
/* f = (-1)^s * 1.m * 2^(e-b)
* -543.75
* 543 / 2 = 271 Rest 1
* 271 / 2 = 135 Rest 1
* 135 / 2 = 67 Rest 1
* 67 / 2 = 33 Rest 1
* 33 / 2 = 16 Rest 1
* 16 / 2 = 8 Rest 0
* 8 / 2 = 4 Rest 0
* 4 / 2 = 2 Rest 0
* 2 / 2 = 1 Rest 0
* 1 / 2 = 0 Rest 1
*
* 10.0001.1111
*
* 0.75 * 2 = 1.5 1
* 0.5 * 2 = 1 1 falsch - nichts
*
* 10.0001.1111.1
* 1,0.0001.1111.1
* 127 + 9 = 136
*
* 136 / 2 = 68 Rest 0
* 68 / 2 = 34 Rest 0
* 34 / 2 = 17 Rest 0
* 17 / 2 = 8 Rest 1
* 8 / 2 = 4 Rest 0
* 4 / 2 = 2 Rest 0
* 2 / 2 = 1 Rest 0
* 1 / 2 = 0 Rest 1
*
* 1000.1000
* 136 ^= 1000.1000
*
1,0.0001.1111.1,11
|0|1000.1000|1,0.0001.1111.1,11
|0|10001000|1000011111111
1100.0100.0100.0011.1111.1100
1100.0100.0000.0111.1111.1000
C407F8
*/