A voir également:
- Savoir comment manipuler un reel sur c++
- Maps satellite en temps réel - Guide
- Regle reel sur telephone - Guide
- Google maps trafic en temps réel - Guide
- Partager sa position en temps réel - Guide
- Transformer une story en reel - Guide
1 réponse
Qu'est ce que tu appelles la conversion binaire d'un double ?
Tu parles de ça ?
https://fr.wikipedia.org/wiki/IEEE_754
Pour extraire la partie entière d'un double, voir les fonction ceil, floor, round et nearbyint etc...
https://linux.die.net/man/3/ceil
Dans l'absolu tu peux afficher la valeur binaire stockée en mémoire comme suit :
... ce qui donne :
Comme tu le vois pour un uint16_t et uint32_t il faut faire gaffe à l'endianness pour voir les bits dans le bon ordre (chose que je n'ai pas faite pour le double, où les bits de mantisses et d'exposants ne sont pas écrits dans l'ordre).
https://fr.wikipedia.org/wiki/Endianness
C'est pourquoi pour plus de lisibilité j'ai initialisé i16 avec une notation hexadécimale mais bien entendu tu peux utiliser la notation décimale si tu préfères. L'intérêt est ici de voir que chaque caractère hexadécimal correspond à 4 bits en notation binaire donc par exemple 1 correspond à 0001, 2 à 0010, 3 à 0011, etc... Ainsi on retrouve bien dans cet exemple que 0x1234 devient 0001 0010 0011 0100 et que chaque octet (byte en anglais) est écrit dans l'ordre.
En pratique un PC moderne utilise un encodage little-endian tandis que la représentation "mathématique" d'un nombre serait big-endian qui est celle utilisée en réseau. Les fonction htons et htonl permettent de s'abstraire de l'endianness utilisée par le système pour la traduire dans l'endianness "mathématique".
Bonne chance
Tu parles de ça ?
https://fr.wikipedia.org/wiki/IEEE_754
Pour extraire la partie entière d'un double, voir les fonction ceil, floor, round et nearbyint etc...
https://linux.die.net/man/3/ceil
Dans l'absolu tu peux afficher la valeur binaire stockée en mémoire comme suit :
#include <stdio.h> #include <stdint.h> #include <stddef.h> #include <arpa/inet.h> void print_uint8_bin(uint8_t x) { unsigned i, j; for (i = 0; i < 8; ++i) { j = 7 - i; printf("%d", (x & (1 << j)) ? 1 : 0); if (i % 4 == 3) printf(" "); } } void print_bytes_impl(uint8_t * bytes, size_t num_bytes) { size_t i; for (i = 0; i < num_bytes; ++i, ++bytes) { print_uint8_bin(*bytes); printf(" "); } printf("\n"); } #define print_bytes(x) print_bytes_impl((uint8_t *) &x, sizeof(x)) int main() { uint16_t i16 = htons(0x1234); uint32_t i32 = htonl(0x12345678); double x = 1.0; print_bytes(i16); print_bytes(i32); print_bytes(x); return 0; }
... ce qui donne :
(mando@silk) (~) $ gcc toto.c && ./a.out 0001 0010 0011 0100 0001 0010 0011 0100 0101 0110 0111 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 0000 0011 1111
Comme tu le vois pour un uint16_t et uint32_t il faut faire gaffe à l'endianness pour voir les bits dans le bon ordre (chose que je n'ai pas faite pour le double, où les bits de mantisses et d'exposants ne sont pas écrits dans l'ordre).
https://fr.wikipedia.org/wiki/Endianness
C'est pourquoi pour plus de lisibilité j'ai initialisé i16 avec une notation hexadécimale mais bien entendu tu peux utiliser la notation décimale si tu préfères. L'intérêt est ici de voir que chaque caractère hexadécimal correspond à 4 bits en notation binaire donc par exemple 1 correspond à 0001, 2 à 0010, 3 à 0011, etc... Ainsi on retrouve bien dans cet exemple que 0x1234 devient 0001 0010 0011 0100 et que chaque octet (byte en anglais) est écrit dans l'ordre.
En pratique un PC moderne utilise un encodage little-endian tandis que la représentation "mathématique" d'un nombre serait big-endian qui est celle utilisée en réseau. Les fonction htons et htonl permettent de s'abstraire de l'endianness utilisée par le système pour la traduire dans l'endianness "mathématique".
Bonne chance