Savoir comment manipuler un reel sur c++
Fermé
Volatil_mythique
Messages postés
3
Date d'inscription
dimanche 23 juin 2013
Statut
Membre
Dernière intervention
29 juin 2013
-
29 juin 2013 à 15:07
mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 13 juil. 2013 à 19:38
mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 13 juil. 2013 à 19:38
A voir également:
- Savoir comment manipuler un reel sur c++
- Remettre un reel sur la grille de profil ✓ - Forum Instagram
- Dans le texte, un seul mot a réellement été écrit en lettres capitales (majuscules). quel est ce mot ? ✓ - Forum Word
- Vue satellite en temps réel gratuit ✓ - Forum Satellite
- Jeu gratuit pour gagner de l'argent réel avis - Forum Internet / Réseaux sociaux
- Durée reel instagram - Guide
1 réponse
mamiemando
Messages postés
32283
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 mars 2023
7 572
Modifié par mamiemando le 13/07/2013 à 19:43
Modifié par mamiemando le 13/07/2013 à 19:43
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