Pregunta

¿Cómo convertir __int64 a largo en Windows (MSVC8 y MSVC6)?

¿Funcionará un encasillamiento normal?

Además, ¿qué tal convertir long a __int64?Si el largo es un valor negativo, ¿funcionará?

Nota: estoy hablando de un escenario en el que la variable __int64 siempre contendrá un valor que no tendrá más de 32 bits de longitud.

¿Fue útil?

Solución

1.Convertir largo a __int64

Según MSDN sobre el __int64 palabra clave:

La palabra clave _ _int64 declara un nuevo type, un entero de 64 bits (8 bytes).Como con los tipos int, short y long, El tipo de _int64 _ tiene un versión sin firmar, por lo que el _ _int64 en realidad se puede usar para crear Dos tipos.

En el siguiente ejemplo de código se muestra cómo declarar dos enteros de 64 bits, uno Firmado y el otro sin firmar:

__int64 firmado_big_int;sin firmar __int64 sin firmar_big_int;

__int64 está firmado y debe ser más ancho que long.Entonces podrías asignar long a __int64 sin siquiera un elenco tipográfico y por supuesto el signed __int64 soporte negativo largo.

2.Convertir __int64 a largo

Está bien convertir __int64 a long,solo con posibilidad de perder datos. Mi msvc8 solo me advierte de la posibilidad de pérdida de datos.

3.Nota:

C99 definió un tipo entero estándar de 64 bits llamado int64_t y versión sin firmar uint64_t en stdint.h.Si desea proporcionar código portátil, debe usarlos pero no __int64.

Tenga en cuenta que no existe un tipo entero estándar de 64 bits en el lenguaje de programación C++, uso MSVC __int64, pero en el mundo Linux normalmente usas int64_t o uint64_t que es el tipo definido como long long o unsigned long long en C99 stdint.h.Aquí asumo que su compilador de C++ admite el stdint.h archivo de cabecera.

Otros consejos

Sí, encasillamiento va a estar bien, siempre y cuando usted puede garantizar sus valores __int64 son siempre dentro del rango de una larga. De reparto en la otra dirección, es decir de largo a __int64 no será un problema independientemente de los valores implicados.

Aquí está una pequeña prueba. Las conversiones explícitas son necesarias para evitar las advertencias si se compila con /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 salida es:

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

valores de 32 bits se pueden asignar a las variables de 64 bits sin ningún problema, con o sin signo. La asignación de un valor de 64 bits a una variable de 32 bits se puede hacer, pero la pérdida de datos es posible si se requieren más de 32 bits para almacenar el valor, ya que será truncado para encajar en la variable más pequeño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top