sábado, 4 de fevereiro de 2012

C: Modificadores de sinal e tamanho

A linguagem C tem basicamente quatro modificadores de tipo, dois em relação ao sinal, signed e unsigned, e dois relativo a tamanho da variável, short e long.

signed e unsigned

Estes são manipuladores de sinal. Você pode dizer que uma variável inteira tem sinal:

signed int    i ;

Ou não tem sinal:

unsigned int   j ;

Em um sistema (hardware, sistema operacional e compilador) no qual o int seja de 16 bits, a variável i poderá armazenar de -32768 a 32767, e a variável j poderá armazenar de 0 a 65535. A quantidade de valores possíveis nos dois casos é igual, se pode representar números negativos ou não é a diferença.

Variáveis unsigned são boas para índices de arrays (vetores), matrizes etc, e para casos que se sabe que não serão armazenados números negativos.

As variáveis int são signed, por definição, mas o char parece depender do sistema. Já vi sendo signed e unsigned. Neste caso, quando usar como índice de array com mais de 127 itens, ou os valores a serem armazenados podem passar de 127 (e claro, menor do que 256), deve-se usar unsigned char.

Nota: Só se aplica nos tipos inteiros, e não nos de ponto flutuante, como float e double.

short e long

Estes são modificadores de tamanho. O short diz que o inteiro é de 16 bits, independente da arquitetura do processador (processadores de 8, 16, 32 ou 64 bits), e o long diz que é de 32 bits. O int pode variar segundo a arquitetura do processador, mas em todos os casos que vi eram de 16 e 32 bits.

Atualmente é comum existirem inteiros de 64 bits, e eles são necessários para vários usos. Para não criar uma nova palavra reservada, que pode, por algum azar, coincidir com o nome de alguma variável e impedir que um programa compile de primeira, então se usa long long para definir um inteiro de 64 bits.

Alguns processadores também tem um número de ponto flutuante de tamanho maior que o de 64 bits do double, então nestes casos se usa long double.

Abreviações

Existem algumas abreviações possíveis, como short int pode ser abreviado para short, long int para long, unsigned int para unsigned, unsigned long int para unsigned long etc. Em suma, quando não se informa se é int o char, é assumido que é int.

Exemplo de definições

Abaixo tem um amplo exemplo de definições com a maioria, se não todas, as possibilidades, de definições de inteiros. Ainda tem a definição de long double.

main()
{
        char                            c       ;
        signed  char                    cs      ;
        unsigned char                   cu      ;

        int                             i       ;
        signed  int                     iS      ;
        unsigned int                    iU      ;
        signed                          S       ;
        unsigned                        U       ;

        short   int                     is      ;
        short                           s       ;

        long    int                     il      ;
        long                            l       ;

        long    long    int             ill     ;
        long    long                    ll      ;

        signed  short   int             isS     ;
        unsigned short  int             isU     ;
        signed  short                   sS      ;
        unsigned short                  sU      ;

        signed  long    int             ilS     ;
        unsigned long   int             ilU     ;
        signed  long                    lS      ;
        unsigned long                   lU      ;

        signed  long    long    int     illS    ;
        unsigned long   long    int     illU    ;
        signed  long    long            llS     ;
        unsigned long   long            llU     ;

        short   signed  int             isS_    ;
        short   unsigned int            isU_    ;
        short   signed                  sS_     ;
        short   unsigned                sU_     ;

        long    signed  int             ilS_    ;
        long    unsigned int            ilU_    ;
        long    signed                  lS_     ;
        long    unsigned                lU_     ;

        long    long    signed  int     illS_   ;
        long    long    unsigned int    illU_   ;
        long    long    signed          llS_    ;
        long    long    unsigned        llU_    ;

        float                           f       ;
        double                          d       ;
        long    double                  dl      ;

        /* Isto dá erro,provando que char não é modificador de int.
                A definição char é um tipo pode si próprio.
        char    int                     ci      ;
        int     char                    ic      ;
        */

}

Nenhum comentário:

Postar um comentário