c++ htonl - Punto galleggiante Endianness?




ntohl big (4)

Sto scrivendo un client e un server per un simulatore off-shore in tempo reale e, dato che devo inviare molti dati attraverso un socket, sto usando dati binari per massimizzare la quantità di dati che posso inviare. Conosco già gli interi endianness e come usare htonl e ntohl per aggirare i problemi di endianness, ma la mia applicazione, come quasi tutti i software di simulazione, si occupa di molti float.

La mia domanda è: c'è qualche problema di endianità che si occupa di formati binari di numeri in virgola mobile? So che tutte le macchine su cui verrà eseguito il mio codice usano l'implementazione IEEE di punti mobili, ma c'è qualche problema di endianness quando si ha a che fare con i float?

Dal momento che ho accesso solo a macchine con lo stesso endian, non posso testarlo da solo. Quindi, sarò felice se qualcuno mi può aiutare con questo.

Grazie in anticipo.


Answers

EDIT: IL SEGUENTE È SBAGLIATO RISPOSTA (lasciando che la gente sappia che questa visione "un po 'popolare" è sbagliata, leggi la risposta e i commenti accettati su questa risposta)

--WRONG ANSWER BEGIN--

Non esiste nulla come endianness in virgola mobile o endianness intero ecc. La sua semplice rappresentazione binaria endianness. O una macchina è little-endian, o il suo big-endian. Ciò significa che rappresenterà il MSb / MSB nella rappresentazione binaria di qualsiasi tipo di dati come il suo primo bit / byte o ultimo bit / byte. Questo è tutto.

- FRONTE ALLA RISPOSTA ---



Secondo Wikipedia ,

Virgola mobile e endianness

Su alcune macchine, mentre gli interi erano rappresentati in forma little-endian, i numeri in virgola mobile erano rappresentati in forma big-endian. Poiché esistono molti formati in virgola mobile e una mancanza di una rappresentazione di "rete" standard, non è stato creato uno standard per il trasferimento di valori in virgola mobile. Ciò significa che i dati in virgola mobile scritti su una macchina potrebbero non essere leggibili su un'altra, e questo è il caso anche se entrambi utilizzano l'aritmetica in virgola mobile IEEE 754 poiché la endianità della rappresentazione della memoria non fa parte delle specifiche IEEE.


Ma perché dovresti avere entrambe le funzioni nella stessa definizione di classe?

A volte si desidera fornire semantica diversa per la stessa operazione a seconda che venga invocata su oggetto const O oggetto non-const . Prendiamo un esempio di classe std::string : -

char& operator[](int index);
const char& operator[](int index) const;

In questo caso quando l' operator[] invocato tramite l'oggetto const non consente all'utente di modificare il contenuto della stringa.

const std::string str("Hello");
str[1] = 'A';     // You don't want this for const.

D'altra parte, in caso di stringa non const, si lascia che l'utente cambi il contenuto della stringa. Ecco perché un sovraccarico diverso.

E come fa il compilatore a distinguere tra questi?

Il compilatore controlla se quel metodo è invocato su oggetto const O non-const e quindi chiama in modo appropriato quel metodo.

const std::string str("Hello");
cout << str[1];           // Invokes `const` version.

std::string str("Hello");
cout << str[1];           // Invokes non-const version.




c++ networking endianness