бинарное представление типов данных, числа с плавающей запятой

Автор kol1978, 23 августа 2024, 11:00:35

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

kol1978

Для примера рассматриваю пример отсюда: https://stackoverflow.com/questions/44609743/obtaining-bit-representation-of-a-float-in-c
там требуется бинарное представление числа = 3.14159
для проверки данные отсюда: http://www.weitz.de/ieee/
Цитировать0b0100000000001001001000011111100111110000000110111000011001101110
  0100000000001001001000011111100111110000000110111000011001101110
Вопрос в том что мне не понятен результат работы программы для объединения из массива типа char (
Цитироватьstruct {char uuu[8];} UUU;          //не пригоден так тоже
struct {unsigned char uu[8];} UU;         //не пригоден
) в программе ниже?
Или фундаментально не понимаю то чем является тип char - что это не просто один байт? или это проблема вывода функции printf и поэтому программа в этом отношении правильна? по отношению к объединению из массива типа int - как организовать вывод?
вывод программы:
Цитировать....
0 10000000 10010010000111111010000
01000000010010010000111111010000
float_L.u
1000000010010010000111111010000

01000000010010010000111111010000

0x59bb357a5020 8
0x59bb357a5020 8

0x59bb357a5020 8

0x59bb357a5020 8

0x59bb357a5020 8

100000000001001001000011111100111110000000110111000011001101110    - вывод массива int верен
10000001001100001111110011111000011011100001101101110               -  это не верно
10000001001100001111111111111111111111111111110011111111111111111111111111111000011011111111111111111111111111100001101101110                                                     - это тоже
100000000001001001000011111100111110000000110111000011001101110  - вывод два раза по int верен
0100000000001001001000011111100111110000000110111000011001101110  - вывод битового поля верен

Программа для amd64:
Цитироватьunion
{
    float f;
    unsigned int u;
    struct {
       // unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
        unsigned bit8:1;
        unsigned bit9:1;
        unsigned bit10:1;
        unsigned bit11:1;
        unsigned bit12:1;
        unsigned bit13:1;
        unsigned bit14:1;
        unsigned bit15:1;
        unsigned bit16:1;
        unsigned bit17:1;
        unsigned bit18:1;
        unsigned bit19:1;
        unsigned bit20:1;
        unsigned bit21:1;
        unsigned bit22:1;
        unsigned bit23:1;
        unsigned bit24:1;
        unsigned bit25:1;
        unsigned bit26:1;
        unsigned bit27:1;
        unsigned bit28:1;
        unsigned bit29:1;
        unsigned bit30:1;
        unsigned bit31:1;
        unsigned bit32:1;

    } byte;

} float_L;

union
{
    double d;
    struct {unsigned int u[2];} U;
    struct {char uuu[8];} UUU;          //не пригоден так тоже
struct {unsigned char uu[8];} UU;         //не пригоден
    struct {unsigned int u1; unsigned int u2;} Uu;                      //unsigned int u3; unsigned int u4;} Uu;
    struct {
      //  unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
        unsigned bit8:1;
        unsigned bit9:1;
        unsigned bit10:1;
        unsigned bit11:1;
        unsigned bit12:1;
        unsigned bit13:1;
        unsigned bit14:1;
        unsigned bit15:1;
        unsigned bit16:1;
        unsigned bit17:1;
        unsigned bit18:1;
        unsigned bit19:1;
        unsigned bit20:1;
        unsigned bit21:1;
        unsigned bit22:1;
        unsigned bit23:1;
        unsigned bit24:1;
        unsigned bit25:1;
        unsigned bit26:1;
        unsigned bit27:1;
        unsigned bit28:1;
        unsigned bit29:1;
        unsigned bit30:1;
        unsigned bit31:1;
        unsigned bit32:1;
        unsigned bit33:1;
        unsigned bit34:1;
        unsigned bit35:1;
        unsigned bit36:1;
        unsigned bit37:1;
        unsigned bit38:1;
        unsigned bit39:1;
        unsigned bit40:1;
        unsigned bit41:1;
        unsigned bit42:1;
        unsigned bit43:1;
        unsigned bit44:1;
        unsigned bit45:1;
        unsigned bit46:1;
        unsigned bit47:1;
        unsigned bit48:1;
        unsigned bit49:1;
        unsigned bit50:1;
        unsigned bit51:1;
        unsigned bit52:1;
        unsigned bit53:1;
        unsigned bit54:1;
        unsigned bit55:1;
        unsigned bit56:1;
        unsigned bit57:1;
        unsigned bit58:1;
        unsigned bit59:1;
        unsigned bit60:1;
        unsigned bit61:1;
        unsigned bit62:1;
        unsigned bit63:1;
        unsigned bit64:1;
    } byte_d;

} double_L;

int main()
{
        unsigned int ra;
        float_L.f=3.14159;   //  32 битное число - 4 байта

        printf("%p %lu\n",&float_L.f,sizeof(float_L.f));   //выводит адрес памяти и размер в байтах для f
        printf("%p %lu\n",&float_L.u,sizeof(float_L.u));  //выводит адрес памяти и размер в байтах для u

  printf("\n");
          for(ra=0x80000000;ra;ra>>=1)
        {
            /*
            if(ra==0x40000000){printf(" "); printf("%b\n", ra); printf(" ");} // отделить знак числа
            if(ra==0x00400000){printf(" "); printf("%b\n", ra); printf(" ");} // отделить порядок от мантисы
            if(ra&float_L.u) printf("1"); else printf("0");
*/
            if(ra==0x40000000) printf(" ");
            if(ra==0x00400000) printf(" ");
            if(ra&float_L.u) printf("1"); else printf("0");
        }
printf("\n");

        for(ra=0x80000000;ra;ra>>=1)    // число в 4 байта с b10000000000000000000000000000000 уменьшается до 0
        {
            if(ra&float_L.u) printf("1"); else printf("0");
           // printf("in bin ra: %b\n", ra);
        }
 printf("\nfloat_L.u\n%b\n",float_L.u);
     //   cout << "\n" << float_L.byte.bit1 << float_L.byte.bit2 << float_L.byte.bit3 << float_L.byte.bit4 << float_L.byte.bit5 << float_L.byte.bit6 << float_L.byte.bit7 << float_L.byte.bit8 << float_L.byte.bit9 << float_L.byte.bit10 << float_L.byte.bit11 << float_L.byte.bit12 << float_L.byte.bit13 << float_L.byte.bit14 << float_L.byte.bit15 << float_L.byte.bit16 << float_L.byte.bit17 << float_L.byte.bit18 << float_L.byte.bit19 << float_L.byte.bit20 << float_L.byte.bit21 << float_L.byte.bit22 << float_L.byte.bit23 << float_L.byte.bit24 << float_L.byte.bit25 << float_L.byte.bit26 << float_L.byte.bit27 << float_L.byte.bit28 << float_L.byte.bit29 << float_L.byte.bit30 << float_L.byte.bit31 << float_L.byte.bit32; // << float_L.byte.bit31;
 cout << "\n" << float_L.byte.bit32 << float_L.byte.bit31 << float_L.byte.bit30 << float_L.byte.bit29 << float_L.byte.bit28 << float_L.byte.bit27 << float_L.byte.bit26 << float_L.byte.bit25 << float_L.byte.bit24 << float_L.byte.bit23 << float_L.byte.bit22 << float_L.byte.bit21 << float_L.byte.bit20 << float_L.byte.bit19 << float_L.byte.bit18 << float_L.byte.bit17 << float_L.byte.bit16 << float_L.byte.bit15 << float_L.byte.bit14 << float_L.byte.bit13 << float_L.byte.bit12 << float_L.byte.bit11 << float_L.byte.bit10 << float_L.byte.bit9 << float_L.byte.bit8 << float_L.byte.bit7 << float_L.byte.bit6 << float_L.byte.bit5 << float_L.byte.bit4 << float_L.byte.bit3 << float_L.byte.bit2 << float_L.byte.bit1; // << float_L.byte.bit31;

        double_L.d = 3.14159;    // 64 битное число - 8 байт
 printf("\n" "\n");
 printf("%p %lu\n",&double_L.d,sizeof(double_L.d));   //выводит адрес памяти и размер в байтах
printf("%p %lu\n",&double_L.U,sizeof(double_L.U)); printf("\n");
printf("%p %lu\n",&double_L.Uu,sizeof(double_L.Uu)); printf("\n");
printf("%p %lu\n",&double_L.UU,sizeof(double_L.UU)); printf("\n");
printf("%p %lu\n",&double_L.UUU,sizeof(double_L.UUU)); printf("\n");

printf("%b", double_L.U.u[1]); printf("%b", double_L.U.u[0]);  printf("\n"); //http://www.weitz.de/ieee/  -проверка    0b0100000000001001001000011111100111110000000110111000011001101110
printf("%b", double_L.UU.uu[7]); printf("%b", double_L.UU.uu[6]);printf("%b", double_L.UU.uu[5]); printf("%b", double_L.UU.uu[4]); printf("%b", double_L.UU.uu[3]); printf("%b", double_L.UU.uu[2]);printf("%b", double_L.UU.uu[1]); printf("%b", double_L.UU.uu[0]);  printf("\n");
printf("%b", double_L.UUU.uuu[7]); printf("%b", double_L.UUU.uuu[6]);printf("%b", double_L.UUU.uuu[5]); printf("%b", double_L.UUU.uuu[4]); printf("%b", double_L.UUU.uuu[3]); printf("%b", double_L.UUU.uuu[2]);printf("%b", double_L.UUU.uuu[1]); printf("%b", double_L.UUU.uuu[0]);  printf("\n");
printf("%b", double_L.Uu.u2); printf("%b", double_L.Uu.u1);  printf("\n");   //0b0100000000001001001000011111100111110000000110111000011001101110
cout << "\n" << double_L.byte_d.bit64 << double_L.byte_d.bit63 << double_L.byte_d.bit62 << double_L.byte_d.bit61 << double_L.byte_d.bit60 << double_L.byte_d.bit59 << double_L.byte_d.bit58 << double_L.byte_d.bit57 << double_L.byte_d.bit56 << double_L.byte_d.bit55 << double_L.byte_d.bit54 << double_L.byte_d.bit53 << double_L.byte_d.bit52 << double_L.byte_d.bit51 << double_L.byte_d.bit50 << double_L.byte_d.bit49 << double_L.byte_d.bit48 << double_L.byte_d.bit47 << double_L.byte_d.bit46 << double_L.byte_d.bit45 << double_L.byte_d.bit44 << double_L.byte_d.bit43 << double_L.byte_d.bit42 << double_L.byte_d.bit41 << double_L.byte_d.bit40 << double_L.byte_d.bit39 << double_L.byte_d.bit38 << double_L.byte_d.bit37 << double_L.byte_d.bit36 << double_L.byte_d.bit35 << double_L.byte_d.bit34 << double_L.byte_d.bit33 << double_L.byte_d.bit32 << double_L.byte_d.bit31 << double_L.byte_d.bit30 << double_L.byte_d.bit29 << double_L.byte_d.bit28 << double_L.byte_d.bit27 << double_L.byte_d.bit26 << double_L.byte_d.bit25 << double_L.byte_d.bit24 << double_L.byte_d.bit23 << double_L.byte_d.bit22 << double_L.byte_d.bit21 << double_L.byte_d.bit20 << double_L.byte_d.bit19 << double_L.byte_d.bit18 << double_L.byte_d.bit17 << double_L.byte_d.bit16 << double_L.byte_d.bit15 << double_L.byte_d.bit14 << double_L.byte_d.bit13 << double_L.byte_d.bit12 << double_L.byte_d.bit11 << double_L.byte_d.bit10 << double_L.byte_d.bit9 << double_L.byte_d.bit8 << double_L.byte_d.bit7 << double_L.byte_d.bit6 << double_L.byte_d.bit5 << double_L.byte_d.bit4 << double_L.byte_d.bit3 << double_L.byte_d.bit2 << double_L.byte_d.bit1;

    return 0;
}