Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    17

    c++ tipi base uguale su tutte le piattaforme

    Salve non riesco a capire come funziona il discorso dei byte che un tipo può avere su diverse macchine.

    Io voglio che un intero sia sempre a 32bit(4byte) su tutte le piattaforme e quindi volevo capire se il controllo lo devo fare in fase di compilazione o in run-time.

    In pratica sulla mia macchina gli interi sono a 32bit.
    Cosa succederebbe se compilassi un programma e lo eseguissi su una macchina dove un intero è di 64bit?e su una macchina dove un intero è di 16 bit?

    Se la risposta è ...rimane a 32 bit... il problema rimane solo in fase di compilazione e la portabilità riguarda solo i sorgenti e il compilatore che utilizzo?

    In java i tipi base hanno sempre gli stessi byte, siccome suppongo abbiano creato una parte di codice dove ridefiniscono i nuovi tipi, se eliminassi quel tipo di implementazione e lasciassi i tipi base di (c) e compilassi l'intero linguaggio su una macchina che coincide con i limiti attuali(di Java), avrei lo stesso risultato?

    ATTENZIONE non mi interessa compilare java era solo per capire il concetto.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Lo stesso programma, non concepito tenendo conto di poter essere eseguito su sistemi sia 32 bit che 64 bit può causare una lunga serie di comportamenti non voluti.
    Cito un sito trovato che elenca una serie di problematiche: http://www.ibm.com/developerworks/li...t64/index.html
    Ciao.

  3. #3
    Se ti serve che un intero abbia delle dimensioni fissate, sui sistemi POSIX, sui compilatori che supportano C99 e da C++11 in poi è disponibile l'header <stdint.h> (<cstdint> nella versione C++) che contiene dei typedef per tipi a dimensioni garantite; in ogni caso, anche prima che si standardizzasse <stdint.h> praticamente ogni compilatore aveva qualche estensione non-standard che faceva la stessa cosa.

    Il punto è che devi vedere se effettivamente un intero a larghezza fissata ti è davvero necessario: in genere gli unici casi in cui serve per davvero è quando devi leggere/scrivere file binari o comunque inviare dati binari in qualche maniera. Se ti è sufficiente il range minimo garantito dallo standard per i tipi primitivi (o sai che sulle piattaforme per cui compili il range effettivo è quello che ti interessa) in genere ti conviene usare i tipi "classici", in particolare il semplice int, che dovrebbe essere il tipo nativo* (o quasi) della piattaforma.
    Se invece richiedi senza motivo interi troppo grossi in alcuni casi potresti incorrere in problemi di prestazioni: una CPU a 32 bit non lavora nativamente su interi a 64 bit, per cui il processore deve "simulare" le operazioni usando più istruzioni.

    * in realtà su Windows a 64 bit int resta a 32 bit per compatibilità con la montagna di codice che assume che int sia a 32 bit, ma su praticamente ogni altro sistema non è così; altra precisazione, ovviamente int è il tipo nativo compatibilmente con il range minimo garantito: su una CPU a 8 bit ovviamente int (che richiede come range minimo -32768~32767) non può essere "l'intero nativo", dato che deve essere almeno 16 bit.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    17
    Originariamente inviato da MItaly
    Se ti serve che un intero abbia delle dimensioni fissate, sui sistemi POSIX, sui compilatori che supportano C99 e da C++11 in poi è disponibile l'header <stdint.h> (<cstdint> nella versione C++) che contiene dei typedef per tipi a dimensioni garantite; in ogni caso, anche prima che si standardizzasse <stdint.h> praticamente ogni compilatore aveva qualche estensione non-standard che faceva la stessa cosa.

    Il punto è che devi vedere se effettivamente un intero a larghezza fissata ti è davvero necessario: in genere gli unici casi in cui serve per davvero è quando devi leggere/scrivere file binari o comunque inviare dati binari in qualche maniera. Se ti è sufficiente il range minimo garantito dallo standard per i tipi primitivi (o sai che sulle piattaforme per cui compili il range effettivo è quello che ti interessa) in genere ti conviene usare i tipi "classici", in particolare il semplice int, che dovrebbe essere il tipo nativo* (o quasi) della piattaforma.
    Se invece richiedi senza motivo interi troppo grossi in alcuni casi potresti incorrere in problemi di prestazioni: una CPU a 32 bit non lavora nativamente su interi a 64 bit, per cui il processore deve "simulare" le operazioni usando più istruzioni.

    * in realtà su Windows a 64 bit int resta a 32 bit per compatibilità con la montagna di codice che assume che int sia a 32 bit, ma su praticamente ogni altro sistema non è così; altra precisazione, ovviamente int è il tipo nativo compatibilmente con il range minimo garantito: su una CPU a 8 bit ovviamente int (che richiede come range minimo -32768~32767) non può essere "l'intero nativo", dato che deve essere almeno 16 bit.
    Sto realizzando un linguaggio di programmazione simile a java e quindi devo avere i tipi con dimensioni fissa ma volevo chiederti se compilo il mio programma su un sistema che ha un intero a 32bit e lo eseguo su un sistema con intero a 64bit, l'intero resta a 32bit?

    Se la risposta è si,se lascio int invece di int32_t e compilo sulla mia macchina che ha come intero 32bit ed eseguo il programma sulla macchina che ha i 64bit(intero) dovrebbe sempre darmi un intero a 32bit?

    grazie

  5. #5
    Originariamente inviato da arasino
    Sto realizzando un linguaggio di programmazione simile a java e quindi devo avere i tipi con dimensioni fissa ma volevo chiederti se compilo il mio programma su un sistema che ha un intero a 32bit e lo eseguo su un sistema con intero a 64bit, l'intero resta a 32bit?
    Se la risposta è si,se lascio int invece di int32_t e compilo sulla mia macchina che ha come intero 32bit ed eseguo il programma sulla macchina che ha i 64bit(intero) dovrebbe sempre darmi un intero a 32bit?
    Sì ad entrambe le domande; nota però che poter eseguire codice compilato a 32 bit su un processore a 64 bit è una peculiarità dell'architettura x86_64, normalmente non è possibile eseguire binari compilati per un'altra architettura.

    Nel tuo caso comunque credo che la cosa giusta da fare sia usare i tipi a dimensione fissata come "tipi sottostanti" ai tipi del tuo linguaggio, in modo da poter compilare indifferentemente a 32 come a 64 bit.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Qui c'è una tabella di corrispondenza dei vari integer type rispetto la piattaforma.
    http://www.viva64.com/en/t/0012/
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    17
    Grazie per le risposte

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 © 2026 vBulletin Solutions, Inc. All rights reserved.