0

нашел в интернете вот такую программу на си, но я не понимаю union, struct не могу понять, сколько памяти сейчас отводится для записи числа, т.к нужно 8 байт. printf("%d sizeof \n", sizeof(var.f)); 4 байта float f;может здесь нужен double

#include <stdio.h>//ограничение по библиотекам  math, stdlib, conio

void printBinary(int n, int i) {

// Prints the binary representation 
// of a number n up to i-bits. 
int k;
for (k = i - 1; k &gt;= 0; k--) {

    if ((n &gt;&gt; k) &amp; 1)
        printf(&quot;1&quot;);
    else
        printf(&quot;0&quot;);
}

}

typedef union {

float f;
struct
{

    // Order is important. 
    // Here the members of the union data structure 
    // use the same memory (32 bits). 
    // The ordering is taken 
    // from the LSB to the MSB. 
    unsigned int mantissa : 23;
    unsigned int exponent : 8;
    unsigned int sign : 1;

} raw;

} myfloat;

// Function to convert real value // to IEEE foating point representation void printIEEE(myfloat var) {

// Prints the IEEE 754 representation 
// of a float value (32 bits) 

printf(&quot;%d | &quot;, var.raw.sign);
printBinary(var.raw.exponent, 8);
printf(&quot; | &quot;);
printBinary(var.raw.mantissa, 23);
printf(&quot;\n&quot;);

}

// Driver Code int main() {

// Instantiate the union 
myfloat var;

// Get the real value 
var.f = -641.34441;
printf(&quot;%d sizeof var.f \n&quot;, sizeof(var.f));//4 байта

// Get the IEEE floating point representation 
printf(&quot;IEEE 754 representation of %f is : \n&quot;,
    var.f);
printIEEE(var);

return 0;

}

Lex
  • 63
  • Да, верно, double обычно 8 байт https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2_%D0%A1%D0%B8 – Mike Mar 13 '21 at 08:02
  • https://ru.stackoverflow.com/q/734576/178988 & https://ru.stackoverflow.com/q/734770/178988. Впрочем, про количество бит всё написано в википедии. – Qwertiy Mar 13 '21 at 08:03
  • unsigned long long тебе понадобится. – Qwertiy Mar 13 '21 at 08:04
  • Вы не написали какое число вам надо конвертировать. Вещественное или целое, но судя по IEEE 754 я думаю вы правы и вам нужно использовать double. Но не просто float заменить на double, нужно так же изменить кол-во бит под мантиссу и экспоненту. Про это вы можете почитать тут. – Павел Ериков stand with Russia Mar 13 '21 at 08:07
  • число конвертирования var.f(десятичное). и да просто заменить float на double не получится. похоже там другие параметры мантис и экспонент – Lex Mar 13 '21 at 08:13
  • unsigned int mantisa : 52; недопустиый размер битового поля – Lex Mar 13 '21 at 08:24
  • @Динис Вы наверно не поменяли unsigned int на unsigned long long т.к. unsigned int - 32 бита, что больше 52 – Павел Ериков stand with Russia Mar 13 '21 at 08:29
  • да спасибо, я поменял, но кажется он добавляет лишние цифры.printIEEE тоже нужно менять? я это сделал – Lex Mar 13 '21 at 08:38
  • 1
    @Динис Qwertiy привел ссылки на 2 вопроса. Почитайте их, там я думаю есть нужная для вас информация. – Павел Ериков stand with Russia Mar 13 '21 at 10:24

0 Answers0