Question

J'ai une routine de niveau binaire rapide qui calcule une valeur, et retourne un UInt32. Je dois stocker cette valeur dans SQL Server dans un champ int 32 bits. Je ne veux pas augmenter la taille du champ, et que vous voulez juste pour stocker les « octets » de cette fonction le champ int.

Des centaines de ces documents sont demandés à un moment, donc j'ai besoin le meilleur moyen de convertir un UInt32 à int dans une boucle. Si le bit le plus à gauche est situé dans le UInt32, il faut définir le bit de signe de l'int (ou faire quelque chose « reproductible », vraiment, mais le bit de signe serait probablement plus facile).

En d'autres termes, je veux juste les 4 octets d'un UInt32 à devenir les 4 octets d'un entier de 32 bits. Je pourrais utiliser la classe BitConverter, mais je ne suis pas sûr que ce moyen le plus rapide. Serait-il plus rapide de le faire avec une zone non contrôlée comme ceci:

UInt32 fld = 4292515959;
unchecked {
    return (int)fld;
    // -2451337
}

Je vois la question inverse a été posée ici, et se demandait si la réponse serait la même dans l'autre sens:

moyen le plus rapide de cast int UInt32 bitwise?

Était-ce utile?

La solution

Je dirais que la version sans contrôle (comme unchecked((int)x)) est la plus rapide, car il n'y a pas d'appel de la méthode. Je ne crois pas qu'il y ait une façon plus rapide.

Par ailleurs, UInt32 est juste un autre nom pour uint ... va dans un sens est le même que d'aller d'une autre manière en termes de performance, de sorte que ce qui est vraiment la même chose que le lien que vous avez publié.


Edit: Je me souviens observer de première main une instance de référence où checked était plus rapide que unchecked (et non, il n'a pas été une version de débogage, il était une version de version avec des optimisations). Je ne sais pas pourquoi cela est arrivé, mais en tout cas, ne pense pas que vous allez gagner quoi que ce soit mesurable en tournant le contrôle de trop-plein.

Autres conseils

unchecked((int)x) est nécessaire que coulée consts et enregistrés et non produit les mêmes résultats (si le code peut compiler).

Par exemple, ce code

uint data = 4292515959;
int uncheckedData;
int checkedData;
unchecked {
    uncheckedData = (int)data;
}
checkedData = (int)data;

Console.WriteLine(data);
Console.WriteLine(uncheckedData);
Console.WriteLine(checkedData);

produit cette sortie

4292515959
-2451337
-2451337

Pour être plus concis, ce code peut être compilé (même résultat que unchecked((int)data))

uint data = 4292515959;
checkedData = (int)data;

Ce code (notez le const) ne peut pas être compilé (nécessite sans contrôle)

const uint data = 4292515959;
checkedData = (int)data;

Ce code ne peut être compilé et (nécessite sans contrôle)

checkedData = (int)4292515959;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top