Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782

    [C] stampa interi a 64bit

    Il mio problema è questo:

    Le proprietà di un file sotto windows sono restituite in una struttura WIN32_FIND_DATA.

    Al suo interno due DWORD contengono i 32 bit alti e i 32 bit bassi che rappresentano le dimensioni a 64bit del file (nFileSizeLow e nFileSizeHigh);

    Come faccio a stampare la dimensione totale?

    Avevo pensato di usare un tipo __int64 (fz nell'esempio sotto) in cui memorizzare le due parti ed usare
    codice:
    wsprintf (fs, "%I64u", fz);
    per memorizzarlo in una stringa.

    Il problema è che se cerco di assegnare alla variabile di tipo __int64 un valore a più di 32 bit il compilatore (Dev-cpp) mi dice che è troppo grande per un tipo long.
    In pratica il compilatore me lo considera come un semplice long.
    In realtà un sizeof() sulla variabile rileva che effettivamente vengono allocati 8 byte!!!

    Per riuscire nel mio scopo ho dovuto fare una cosa un po' macchinosa:

    codice:
    void Report (WIN32_FIND_DATA FData)
    {
     char fs[50];
     __int64  fz;
     DWORD *h;
     
     h=(DWORD *)&fz;
     h++;
    
     fz=FData.nFileSizeLow;
     *h=FData.nFileSizeHigh;
    
     wsprintf (fs, "%I64u", fz);
    
    .....
    .....
    
    }
    cioè uso un puntatore h per accedere alla parte alta dell'intero a 64bit...

    Non posso indirizzare direttamente con un puntatore int64 la zona della struttura contenente nFileSizeLow e nFileSizeHigh poiche questi (ovviamente!) sono memorizzati in posizioni invertite (nFileSizeLow si troverebbe nella parte alta e viceversa...)

    Ma è possibile che non esista un metodo più semplice?
    Non ho trovato API che stampino la dimensione o gestiscano gli int64 (escludento l'ambiente .net che non mi interessa)
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  2. #2
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    e se tu gli mettessi 32bit, poi li shifti e poi gli altri 32?
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  3. #3
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    già provato, dal momento che il compilatore si trova un

    << 32

    mi dice

    "left shift count >= width of type"

    sembra proprio che lo spazio sia allocato ma che non sia capace di gestirlo...
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  4. #4
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    hai un compilatore a 64 bit?

  5. #5
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    risolto con lo shift...

    stupidamente facevo le prove con

    codice:
    __int64 ll;
    
    ll=1<<32;
    senza fare il casting di 1 a __int64.

    facendo il casting o assegnando prima 1 a ll e poi shiftando funziona...
    Scusate.
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.