0
votes

Quelle est la finalité d'un double sur Windows 10 64 bits?

J'utilise c # et j'écris un programme pour envoyer des nombres via UDP. Je suis sur la plate-forme Windows 10 64 bits et j'utilise BitConverter afin d'obtenir les octets à partir d'entiers, de doubles, etc.

À titre d'exemple:

Si j'utilise:

Byte [] data = BitConverter.GetBytes ((int) 1);

J'obtiens, 01000000 en HEX , ce qui serait little endian comme prévu.

Si j'utilise:

Byte [] data = BitConverter.GetBytes ((double) 1);

J'obtiens, 000000000000f03f en HEX , qui ressemble à un nombre big endian mais je n'en suis pas si sûr.

Je suppose que je n'ai pas une bonne compréhension de l'endianess ou du double format. Je suppose qu'il est également possible que les magasins Windows doublent différemment des ints?


0 commentaires

3 Réponses :


1
votes

La représentation binaire du double est différente de celle d'un entier. Il suit la norme ieee pour le stockage des valeurs à virgule flottante. Utilisez le standard ieee et obtenez la représentation binaire de 1, puis vérifiez la finalité du sapin.


0 commentaires

0
votes

une note intéressante. Comme vous le savez peut-être déjà, C # ne définit pas les Endiannes et cela dépend de l'architecture de la CPU, si vous écrivez des applications de plate-forme / architecture croisées, vous pouvez vérifier avec l'appel de méthode bitconverter.littitleendian code>

indique l'ordre d'octet ("endianness") dans lequel les données sont stockées dans cette architecture informatique. P>

remarques forts> p>

Différentes architectures informatiques stockent des données en utilisant différents octets ordres. "Big-Endian" signifie que l'octet le plus important est à gauche fin d'un mot. "Petit-endian" signifie que l'octet le plus important est sur l'extrémité droite d'un mot. p>

note forte> p>

Vous pouvez convertir de l'ordre d'octet de réseau à l'ordre d'octet de l'hôte. ordinateur sans récupérer la valeur du BitConverter.littlettendian code> en passant un, 32 bits, à 16 bits ou 64 Bit Entier au iPaddress.hosttonetworkorder code> méthode. P> BlockQuote>

Si vous avez besoin de différentes Endiannes, vous pouvez convertir suffisamment facilement avec array.Reverse code>. p>

public uint SwapBytes(uint x)
{
    x = (x >> 16) | (x << 16);
    return ((x & 0xFF00FF00) >> 8) | ((x & 0x00FF00FF) << 8);
}

public ulong SwapBytes(ulong x)
{
    x = (x >> 32) | (x << 32);
    x = ((x & 0xFFFF0000FFFF0000) >> 16) | ((x & 0x0000FFFF0000FFFF) << 16);
    return ((x & 0xFF00FF00FF00FF00) >> 8) | ((x & 0x00FF00FF00FF00FF) << 8);
}


0 commentaires

0
votes

Certainement petit-Endian.

N'oubliez pas que l'IEEE FLOTANT-POINT est un fichier Bitfield, le signe ayant une signification plus élevée que l'exposant, ce qui a à son tour une signification plus élevée que la mantissa.

Votre exemple entier n'a qu'un seul champ, et ses bits bas sont définis.

Votre double exemple a toutes les bits de zéro dans le champ de la mantissa et le champ plus important des bits exposants n'est pas nulle. (Les deux sont affectés par le biais utilisé par IEEE-754)

Les bits significatifs sont aux adresses de mémoire supérieures, comme avec l'entier Little-Endian.

Pour référence, IEEE-754 pour 1.0 est {signe: 0, Exponent: 0x3ff, MANTISSA: 0x0000000000000}


0 commentaires