2011-09-30 22 views
14

Ho scaricato MinGW-64, quindi ora posso compilare programmi a 64 bit per Windows 7, utilizzando g ++ 4.7.0 (sperimentale). Ma la seguente riga:sizeof (long) in C++ a 64 bit

cout << sizeof(long) << " " << sizeof(void*) << endl ; 

stampe 4 8, non 8 8. La documentazione per g ++ 4.6.0 dice:

I set ambiente a 64 bit int a 32 bit e lunga e puntatore a 64 bit

Qualcuno sa perché non è sizeof(long) 8?

Modificato per aggiungere: La fonte della mia confusione era che g ++ 4.7.0 per Windows a 64 bit non è (ancora) una parte ufficiale della raccolta del compilatore GNU. Ed è la prima versione a 64 bit con un 32-bit long, quindi la documentazione semplicemente non si applica ad esso. In effetti, se si va al relevant web page, la voce completo per IA-32/x86-64 si compone di questo:

...

+2

Sembra qualcuno ha appena messo in serie la metà delle risposte senza lasciare alcun commento ... – Mysticial

+0

@Mystical: E anche la mia domanda! – TonyK

+0

Se è necessario un numero intero a 64 bit, utilizzare int64_t/uint64_t o definirne uno proprio. In questo modo il tuo codice sarà portatile e non si baserà sulle specifiche della piattaforma per le dimensioni int/long/short. – David

risposta

15

Perché non deve essere. Lo standard C++ richiede solo che sia (se la memoria serve) di almeno 32 bit di larghezza, e almeno grande come int.

MSVC (e l'ABI utilizzato da Windows) definisce long essere larghe 32 bit, e MingW segue l'esempio perché bene, il compilatore è molto più utile quando si è d'accordo con il sistema operativo host

+1

Non sto parlando dello standard C++, sto parlando della documentazione di GNU Compiler Collection. – TonyK

+4

Lo so. Quindi leggi la prima frase nella mia risposta. E l'ultimo. La documentazione che hai trovato solo (presumo) descrive l'ABI per Linux in esecuzione su x64.Non dice nulla sulle altre CPU (ARM, MIPS, Alpha, SPARC o qualsiasi altra cosa), e non dice nulla sulle porte a diversi SO. – jalf

11

Sul sistema operativo microsoft windows avete LLP64 così la dimensione di lunga è di 32 bit. (Vedi tabella)

citazione da wikipedia:

In programmi a 32 bit, puntatori e tipi di dati quali numeri interi hanno generalmente la stessa lunghezza; questo non è necessariamente vero su macchine a 64 bit. La miscelazione dei tipi di dati in linguaggi di programmazione come C e i suoi discendenti come C++ e Objective-C possono quindi funzionare su implementazioni a 32 bit ma non su implementazioni a 64 bit. In molti ambienti di programmazione per linguaggi derivati ​​da C e C su macchine a 64 bit, le variabili "int" sono ancora a 32 bit di larghezza, ma i numeri interi e i puntatori lunghi sono a 64 bit di larghezza. Questi sono descritti come aventi un modello di dati LP64. Un'altra alternativa è il modello di dati ILP64 in cui tutti e tre i tipi di dati sono larghi 64 bit, e anche SILP64 dove anche gli interi "corti" hanno una larghezza di 64 bit. Tuttavia, nella maggior parte dei casi le modifiche richieste sono relativamente minori e semplici e molti programmi ben scritti possono essere semplicemente ricompilati per il nuovo ambiente senza modifiche. Un'altra alternativa è il modello LLP64, che mantiene la compatibilità con il codice a 32 bit lasciando int sia a lungo che a 32 bit. "LL" si riferisce al tipo "long long integer", che ha almeno 64 bit su tutte le piattaforme, inclusi gli ambienti a 32 bit.

Type   ILP64 LP64 LLP64 
char    8  8  8 
short   16  16  16 
int    64  32  32 
long    64  64  32 
long long  64  64  64 
pointer   64  64  64 
+1

Forse un po 'di spiegazione di ciò che la tabella * significa *? ;) – jalf

+1

Come su un link di riferimento? –

+0

Qui i diversi modelli ottenere spiegato: http://en.wikipedia.org/wiki/64-bit –

0

È specifico del sistema operativo. Windows ha ancora la dimensione di 32 bit lunghi uguali

0

La maggior parte delle applicazioni di Windows sono scritti con l'aspettativa che a tutti gli effetti int = long = 32 bit. Immagino che MinGW si stia solo assicurando che sia ancora così e non ci sono sorprese.

2

MinGW è progettato per creare un'applicazione WIN32 e le intestazioni/librerie WIN32 presuppongono che il tipo long (o LONG) sia largo 32 bit anche su un Windows a 64 bit. Microsoft ha deciso che altrimenti molti dei codici sorgente di Windows esistenti dovrebbero essere modificati. Ad esempio, la seguente struttura utilizza i tipi LONG.

typedef struct tagBITMAPINFOHEADER { 
... 
    LONG biWidth; 
    LONG biHeight; 
... 
} BITMAPINFOHEADER 

;

+0

'LUNGO' è solo una macro. Può essere facilmente modificato in 'int32_t', quindi questo non è un motivo valido. – rustyx

0

MinGW è progettato per creare applicazioni Windows e la piattaforma Microsoft ABI specifies che int e long hanno la stessa dimensione di 32 bit. Se MinGW definito long diversamente da MSVC, la maggior parte delle applicazioni esistenti di Windows che utilizzano long si rompono quando compilato usando MinGW.

Detto questo, Cygwin x86_64 segue la convenzione LP64 su Windows, proprio come su Linux (source).

modo da poter utilizzare che per costruire un'applicazione di Windows in cui la dimensione del long è di 8 byte :) caso

prova:

#include <stdio.h> 
#include <windows.h> 

int CALLBACK WinMain(HINSTANCE a, HINSTANCE b, LPSTR c, int d) 
{ 
    char buf[100]; 
    snprintf(buf, sizeof(buf), 
    "sizeof(int)=%d, sizeof(long)=%d, sizeof(long long)=%d\n", 
    sizeof(int), sizeof(long), sizeof(long long)); 
    MessageBox(NULL, buf, "Cygwin Test", MB_OK); 
    return 0; 
} 

Compilare con: C:\cygwin64\bin\gcc.exe -mwindows -m64 cygwin-test.c -o cygwin-test

uscita:

Windows 64-bit LP64 using Cygwin

Problemi correlati