Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C]Warning relativo all'assegnamento di un unsigned long int

    Salve a tutti. Ecco il codice :
    codice:
    #include <stdio.h>
    int main(){
        unsigned long int i=4294967295;
        printf("%lu", i);
        return 0;
    }
    Come vedete si tratta semplicemente di un'assegnazione. Il tipo della variabile i è "unsigned long int", il che significa che la dimensione della sua cella di memoria è di 32 bit o 4 bytes, il che a sua volta vuol dire che può contenere qualsiasi valore compreso tra 0 e 4294967295. Però l'assegnamento mi da il seguente warning: "this decimal constant is unsigned only in ISO C90[Enabled by default]". Che warning è? Qual'è il suo significato? Grazie in anticipo.

  2. #2
    Dipende dal fatto che la gestione dei literal interi è stata modificata dallo standard C89 (o C90) allo standard C99 e successivi.
    Quando tu scrivi un literal intero come 4294967295 il suo valore è chiaro, ma la scelta del suo tipo non è ovvia - è un int? un unsigned int? un long? un unsigned long? altro ancora?
    Lo standard C specifica esattamente come avviene questa scelta: lo standard C89 dice:
    The type of an integer constant is the first of the corresponding list in which its value can be represented. Unsuffixed decimal: int, long int, unsigned long int
    Lo standard C99, invece, dice:
    The type of an integer constant is the first of the corresponding list in which its value can be represented.
    Suffix: none -> int, long int, long long int
    (questo deriva dal fatto che nel C99 è stato introdotto il tipo long long da minimo 64 bit)

    Per cui, se compili il tuo codice in modalità C89, 4294967295 tipicamente sarà un literal di tipo unsigned long, mentre in C99 sarà di tipo long long int. Nel tuo caso poi questo non ha particolari ripercussioni (dato che lo assegni immediatamente ad una variabile di tipo unsigned long), ma in altri casi può essere importante (ad esempio, può influenzare il tipo di dati con cui vengono fatti i calcoli se il literal in questione è inserito in un'espressione).

    In ogni caso, per ovviare al problema puoi dire al compilatore esplicitamente che vuoi un unsigned long (come minimo) specificando il suffisso UL:
    codice:
        unsigned long int i=4294967295UL;
    Amaro C++, il gusto pieno dell'undefined behavior.

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