Conversion __int64 et long dans Windows
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
.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.