Question

Comment convertir __int64 et long dans Windows (MSVC8 & MSVC6)?

Est-ce un travail transtypage normal?

En outre, comment sur la conversion de temps à __int64? Si le temps est une valeur négative, sera-il?

Note - Je parle d'un scénario dans lequel la variable __int64 toujours contenir une valeur qui ne sera pas plus de 32 bits de long

.
Était-ce utile?

La solution

1. Convertir de temps à __int64

MSDN sur le mot-clé __int64 :

  

Le mot-clé _ _int64 déclare une nouvelle   le type, un nombre entier de 64 bits (8 octets). Comme   avec l'int, court et types longs,   _ le type de _int64 a un correspondant   version non signée, de sorte que le _ _int64   mot-clé peut effectivement être utilisé pour créer   deux types.

     

L'exemple de code suivant montre comment   déclarer deux entiers de 64 bits, une   signé et l'autre non signé:

     

__ int64 signed_big_int; unsigned __int64 unsigned_big_int;

__int64 est signé, et il devrait être plus large que long.So vous pouvez assigner long à __int64 sans même un casting de type et bien sûr le soutien de signed __int64 négatif à long.

2. Convertir __int64 à long

Il est OK pour convertir __int64 à long, seulement avec possibilité de perdre data.My msvc8 ne me prévenir de la pssibility de perte de données.

3. Remarque :

C99 défini un type standard entier de 64 bits et la version int64_t nommé non signé uint64_t dans stdint.h.If vous voulez fournir le code portable, vous devez les utiliser mais pas __int64.

Notez qu'il n'y a pas de type standard entier de 64 bits dans un langage de programmation C ++, MSVC utilisation __int64, mais dans le monde de Linux que vous utilisez normalement int64_t ou uint64_t qui est de type défini comme long long ou unsigned long long dans stdint.h.Here de C99 Je suppose que votre compilateur C ++ soutenir le fichier d'en-tête de stdint.h.

Autres conseils

Oui, transtypage sera bien, aussi longtemps que vous pouvez garantir vos valeurs __int64 sont toujours dans la plage d'une longue. Coulée dans l'autre sens, à savoir de temps à __int64 ne sera pas un problème quelles que soient les valeurs impliquées.

Voici un petit test. Les moulages explicites sont nécessaires pour éviter les mises en garde si compilé avec /W3:

#include <limits.h>


int main( int argc, char *argv[] )
{
    __int64 i64;
    long i;

    i64 = -1;
    i = (long)i64;
    printf( "i=%d\n", i );

    i64 = INT_MAX;
    i = (long)i64;
    printf( "i=%d\n", i );

    i64 = INT_MIN;
    i = (long)i64;
    printf( "i=%d\n", i );

    i64 = i;
    printf( "i64=%I64d\n", i64 );
}

La sortie est la suivante:

i=-1
i=2147483647
i=-2147483648
i64=-2147483648

valeurs 32 bits peuvent être affectés à des variables 64 bits sans aucun problème, signé ou non signé. Attribution d'une valeur de 64 bits à une variable de 32 bits peut être fait, mais la perte de données est possible si plus de 32 bits sont nécessaires pour stocker la valeur, car elle sera tronquée pour tenir dans la variable plus petite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top