You are on page 1of 73

Elementos de programao em C

Tipos de dados

Francisco A. C. Pinheiro, Elementos de Programao em C, Bookman, 2012.

Visite os stios do livro para obter material adicional: www.bookman.com.br e www.facp.pro.br/livroc

() Elementos de programao em C 1 / 57
Sumrio

1 Tipos de dados

2 Tipos inteiros

3 Tipos reais de ponto flutuante

4 Tipos complexos

5 Tipos derivados

6 Estruturas e unies

7 Tipos incompletos

8 () Elementos de programao em C 2 / 57
Tipos de dados

Tipos de dados

Um tipo de dado caracteriza um conjunto de valores, determinando:


Natureza. Caracteriza o tipo representado, que pode ser, por exemplo, um
caractere, um nmero inteiro, um nmero real ou uma cadeia de
caracteres.
Tamanho. Determina o tamanho em bits necessrio para armazenar os
valores do tipo.
Representao. Determina a forma como os bits armazenados devem ser
interpretados.
Imagem ou faixa de representao. Determina a faixa de valores vlidos
para o tipo.
A expresso usada para identificar um tipo de dado chamada de
especificador de tipo.

() Elementos de programao em C 3 / 57
Tipos de dados

Tipos de dados

Exemplo
Se o tipo de dado tipo_exem usado para caracterizar os nmeros inteiros
de 8 bits armazenados na forma de complemento-2, temos:

Especificador: tipo_exem.
Natureza: nmeros inteiros.
Tamanho: 8 bits.
Imagem: [128, 127].
Representao: complemento-2.

Os inteiros 32 e 104 so representveis no tipo tipo_exem. J o nmero


real 32, 0 no representvel nesse tipo, embora possa ser convertido em
um valor representvel: o inteiro 32.

() Elementos de programao em C 4 / 57
Tipos de dados Tipos bsicos

Tipos bsicos da linguagem C


Classificao Tipos bsicos

char

Inteiros sinalizados Inteiros sinalizados padres


signed char
short int
int
long int
long long int
Inteiros sinalizados estendidos

Inteiros no sinalizados Inteiros no sinalizados padres


unsigned char
unsigned short int
unsigned int
unsigned long int
unsigned long long int
_Bool
Inteiros no sinalizados estendidos

Ponto flutuante Reais de ponto flutuante


float
double
long double
Complexos
float _Complex
double _Complex
long double _Complex

() Elementos de programao em C 5 / 57
Tipos de dados Tipos bsicos

Classificaes alternativas dos tipos de dados

Caracteres char
signed char
unsigned char

Inteiros char
Inteiros sinalizados
Inteiros no sinalizados
Tipos enumerados

Reais Inteiros
Reais de ponto flutuante

Aritmticos Inteiros

Ponto flutuante Reais de ponto flutuante

Complexos

Escalares Aritmticos
Ponteiros

Agregados Estruturas
Vetores

Domnio real Inteiros e Reais de ponto flutuante

Domnio complexo Complexos

() Elementos de programao em C 6 / 57
Tipos de dados Tipos caracteres

Tipos caracteres

Cada caractere representado por um cdigo numrico.


Os valores podem ser sinalizados ou no.
Tamanho do tipo dado pela macro CHAR_BIT.

Tipo caractere Valor mnimo Valor mximo


char CHAR_MIN CHAR_MAX
signed char SCHAR_MIN SCHAR_MAX
unsigned char 0 UCHAR_MAX

As macros do tamanho e valores mnimo e mximo esto declaradas em


limits.h.

() Elementos de programao em C 7 / 57
Tipos de dados Conjunto bsico de caracteres

Conjunto bsico de caracteres

Conjunto bsico de caracteres-fonte


Conjunto bsico de caracteres de execuo

() Elementos de programao em C 8 / 57
Tipos de dados Conjunto bsico de caracteres

Conjunto bsico de caracteres

Conjunto bsico de caracteres-fonte


Conjunto bsico de caracteres de execuo

Padro ASCII
0 nul 16 dle 32 48 0 64 @ 80 P 96 ` 112 p
1 sch 17 dc1 33 ! 49 1 65 A 81 Q 97 a 113 q
2 stx 18 dc2 34 " 50 2 66 B 82 R 98 b 114 r
3 etx 19 dc3 35 # 51 3 67 C 83 S 99 c 115 s
4 eot 20 dc4 36 $ 52 4 68 D 84 T 100 d 116 t
5 enq 21 nak 37 % 53 5 69 E 85 U 101 e 117 u
6 ack 22 syn 38 & 54 6 70 F 86 V 102 f 118 v
7 bel 23 etb 39 55 7 71 G 87 W 103 g 119 w
8 bs 24 can 40 ( 56 8 72 H 88 X 104 h 120 x
9 ht 25 em 41 ) 57 9 73 I 89 Y 105 i 121 y
10 lf 26 sub 42 * 58 : 74 J 90 Z 106 j 122 z
11 vt 27 esc 43 + 59 ; 75 K 91 [ 107 k 123 {
12 ff 28 fs 44 , 60 < 76 L 92 \ 108 l 124 |
13 cr 29 gs 45 - 61 = 77 M 93 ] 109 m 125 }
14 so 30 rs 46 . 62 > 78 N 94 ^ 110 n 126 ~
15 si 31 us 47 / 63 ? 79 O 95 _ 111 o 127 del

() Elementos de programao em C 8 / 57
Tipos de dados Caracteres multibytes

Caracteres multibytes

Cada caractere representado por uma sequncia de bytes


(caracteres).
Requer a noo de estado para indicar como cada sequncia de
caracteres representada.

() Elementos de programao em C 9 / 57
Tipos de dados Caracteres multibytes

Caracteres multibytes

Exemplo
O padro JIS X 208 define uma codificao em que cada caractere japons
representado por um par de caracteres do conjunto bsico de caracteres.
Neste padro o caractere representado pelos caracteres p e 6.
1 A sequncia <ESC>, $ e B inicia o estado em que os caracteres so
interpretados segundo o padro JIS X 208.
2 A sequncia <ESC>, ( e B termina o estado JIS X 208.
Desse modo, a sequncia
p 6 p <ESC> $ B p 6 <ESC> ( B p 6 n

representa, de fato, uma sequncia de 7 caracteres.


() Elementos de programao em C 10 / 57
Tipos de dados Caracteres multibytes

Caracteres multibytes

Exemplo
O padro JIS X 208 define uma codificao em que cada caractere japons
representado por um par de caracteres do conjunto bsico de caracteres.
Neste padro o caractere representado pelos caracteres p e 6.
1 A sequncia <ESC>, $ e B inicia o estado em que os caracteres so
interpretados segundo o padro JIS X 208.
2 A sequncia <ESC>, ( e B termina o estado JIS X 208.
Desse modo, a sequncia
p 6 p <ESC> $ B p 6 <ESC> ( B p 6 n
p 6 p p 6 n

representa, de fato, uma sequncia de 7 caracteres.


() Elementos de programao em C 10 / 57
Tipos de dados Caracteres multibytes

Padro Unicode

Capaz de representar os caracteres de todos os alfabetos conhecidos.


Existem vrios estilos de codificao:
UTF-32 utiliza 4 bytes (octetos) para representar os caracteres.
UTF-16 utiliza 2 bytes para representar os caracteres, podendo tambm
represent-los como pares de 16 bits.
UTF-8 utiliza de 1 a 4 bytes para representar os caracteres.
No usa sequncia de transio. O estado em que cada caractere
interpretado definido pelo prprio caractere:
0xxxxxxx 1 octeto
110xxxxx 10xxxxxx 2 octetos
1110xxxx 10xxxxxx 10xxxxxx 3 octetos
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 octetos

() Elementos de programao em C 11 / 57
Tipos de dados Caracteres estendidos

Caracteres estendidos

So representados por uma mesma quantidade de bytes.


Costuma-se usar
uma codificao Unicode de tamanho fixo (UTF-32)
uma adaptao de uma codificao Unicode de tamanho varivel
(UTF-8)
O padro UCS (Universal Character Set, semelhante ao Unicode).

O tipo wchar_t (cabealho wchar.h) usado para designar caracteres


estendidos.
Os tipos char16_t e char32_t (cabealho uchar.h) designam caracteres
estendidos codificados no padro UTF-16 e UTF-32, respectivamente.

() Elementos de programao em C 12 / 57
Tipos inteiros

Tamanhos e valores dos tipos inteiros

Tipo inteiro Tamanho Valor mnimo Valor Mximo


signed char 8 128 127
short int 16 32.768 32.767
int 32 2.147.483.648 2.147.483.647
long int 32 2.147.483.648 2.147.483.647
long long int 64 9.223.372.036.854.775.808 9.223.372.036.854.775.807
unsigned char 8 0 255
unsigned short int 16 0 65535
unsigned int 32 0 4.294.967.295
unsigned long int 32 0 4.294.967.295
unsigned long long int 64 0 18.446.744.073.709.551.615

Valores adotados pelo compilador gcc para uma arquitetura de 32 bits e complemento-2
para representao de negativos.

() Elementos de programao em C 13 / 57
Tipos inteiros

Tamanhos e valores dos tipos inteiros

Os valores mnimo e mximo para cada tipo inteiro so determinados


pelas macros do arquivo-cabealho limits.h, mostradas a seguir:

Tipo inteiro mnimo mximo Tipo inteiro mnimo mximo


signed char SCHAR_MIN SCHAR_MAX unsigned char 0 UCHAR_MAX
short int SHRT_MIN SHRT_MAX unsigned short int 0 USHRT_MAX
int INT_MIN INT_MAX unsigned int 0 UINT_MAX
long int LONG_MIN LONG_MAX unsigned long int 0 ULONG_MAX
long long int LLONG_MIN LLONG_MAX unsigned long long int 0 ULLONG_MAX

() Elementos de programao em C 14 / 57
Tipos inteiros

Tamanhos e valores dos tipos inteiros

Os valores mnimo e mximo para cada tipo inteiro so determinados


pelas macros do arquivo-cabealho limits.h, mostradas a seguir:

Tipo inteiro mnimo mximo Tipo inteiro mnimo mximo


signed char SCHAR_MIN SCHAR_MAX unsigned char 0 UCHAR_MAX
short int SHRT_MIN SHRT_MAX unsigned short int 0 USHRT_MAX
int INT_MIN INT_MAX unsigned int 0 UINT_MAX
long int LONG_MIN LONG_MAX unsigned long int 0 ULONG_MAX
long long int LLONG_MIN LLONG_MAX unsigned long long int 0 ULLONG_MAX

O tamanho atribudo a cada tipo dependente da arquitetura.


O padro estabelece a seguinte relao de ordem entre eles:

signed char short int int long int long long int

() Elementos de programao em C 14 / 57
Tipos reais de ponto flutuante

Tipos reais de ponto flutuante

So implementados com a representao sinal, mantissa e expoente:

sinal

expoente mantissa

() Elementos de programao em C 15 / 57
Tipos reais de ponto flutuante

Tipos reais de ponto flutuante

So implementados com a representao sinal, mantissa e expoente:

sinal

expoente mantissa

comum a adoo do padro IEC 60559 (IEEE 754).


Os tamanhos usuais de cada tipo so:

Tipo Sinal Expoente Mantissa


float 1 8 23
double 1 11 52
long double 1 64 63

() Elementos de programao em C 15 / 57
Tipos reais de ponto flutuante

Tipos reais de ponto flutuante


Valores positivos mnimo e mximo para cada tipo
(definidos no arquivo-cabealho float.h):

Tipo Menor valor Maior valor


float FLT_MIN FLT_MAX
double DBL_MIN DBL_MAX
long double LDBL_MIN LDBL_MAX

Valores usuais para uma arquitetura de 32 bits:

Tipo Tamanho Menor valor Maior valor


float 32 1, 17549 1038 3, 40282 10+38
double 64 2, 22507 10308 1, 79769 10+308
long double 128 3, 3621 104932 1, 18973 10+4932

() Elementos de programao em C 16 / 57
Tipos reais de ponto flutuante

Tipos reais de ponto flutuante

O cabealho float.h declara as seguintes macros que podem ser usadas


para tratar impreciso nas operaes com valores de ponto flutuante:

Tipo Macro Valor mximo


float FLT_EPSILON 1 105
double DBL_EPSILON 1 109
long double LDBL_EPSILON 1 109

Cada macro hTIPOi_EPSILON representa o menor valor positivo tal que


1, 0 + hTIPOi_EPSILON 6= 1, 0

() Elementos de programao em C 17 / 57
Tipos complexos

Tipos complexos
Compostos de duas partes: real e imaginria.

Tipo real de ponto Tipo das partes


Tipo complexo flutuante associado real e imaginria
float _Complex float float
double _Complex double double
long double _Complex long double long double

() Elementos de programao em C 18 / 57
Tipos complexos

Tipos complexos
Compostos de duas partes: real e imaginria.

Tipo real de ponto Tipo das partes


Tipo complexo flutuante associado real e imaginria
float _Complex float float
double _Complex double double
long double _Complex long double long double

O cabealho complex.h declara funes para obteno das partes de um


tipo complexo:

creal(expr) retorna a parte real de expr, como um


valor do tipo double.
cimag(expr) retorna a parte imaginria de expr,
como um valor do tipo double.

() Elementos de programao em C 18 / 57
Tipos complexos

Tipos complexos

A macro I, que corresponde constante imaginria, tambm definida no


arquivo-cabealho complex.h:
Exemplo
No trecho de programa a seguir as variveis a, b e c so declaradas como
de tipos complexos.
double _Complex a = 2.4 + 0.5 * I ;
float _Complex b = 2 * a ;
long double _Complex c = 10 + 2.23
+ 2.2 * I + 0.5 * I ;

() Elementos de programao em C 19 / 57
Tipos derivados

Tipos derivados

Tipo vetor. Representa sequncias de valores de um mesmo tipo.


Tipo estrutura. Representa sequncias de valores, possivelmente de
diferentes tipos.
Tipo unio. Representa valores sobrepostos, possivelmente de diferentes
tipos.
Tipo funo. Representa funes.
Tipo ponteiro. Representa valores que so endereos para objetos de tipos
especficos.

() Elementos de programao em C 20 / 57
Estruturas e unies Tipo estrutura

Tipo estrutura

As estruturas permitem declarar valores estruturados, contendo diversos


componentes.
hEstruturai ::= struct [ hEtiquetai ] { hListaComponentesi }

hUnioi ::= union [ hEtiquetai ] { hListaCompnentesi }

hListaComponentesi ::= hDeclTipoi hListaDecli ;


| hListaComponentesi hDeclTipoi hListaDecli ;

hListaDecli ::= hDeclarador i


| hDeclCampoBitsi
| hListaDecli , hDeclarador i
| hListaDecli , hDeclCampoBitsi

hDeclCampoBitsi ::= [ hDeclarador i ] : hQtdBitsi

hDeclarador i ::= Declarador de variveis, vetores, funes, ponteiros, enumeraes,


estruturas ou unies.

() Elementos de programao em C 21 / 57
Estruturas e unies Tipo estrutura

Tipo estrutura

Na especificao de uma estrutura, seus componentes no podem ser


iniciados nem possuir classe de armazenamento.
Vlida Invlida
struct { struct {
char cod , tp ; char cod , tp ;
int valor ; static int valor ;
double taxa ; double taxa = 2.3;
} }

() Elementos de programao em C 22 / 57
Estruturas e unies Tipo estrutura

Tipo estrutura

Cada especificao define um tipo estrutura diferente, mesmo que as


especificaes sejam idnticas.
Exemplo

struct { struct {
int a ; int a ;
char b ; char b ;
} aux , cod ; } taxa ;

As variveis aux e cod possuem o mesmo tipo, diferente do tipo da varivel


taxa.

() Elementos de programao em C 23 / 57
Estruturas e unies Tipo estrutura

Tipo estrutura

O uso de etiqueta permite referncias posteriores a um tipo estrutura j


declarado.
Exemplo

struct exem {
int a ;
struct exem taxa ;
char b ;
} aux , cod ;

Agora a varivel taxa possui o mesmo tipo que as variveis aux e cod.
A expresso struct exem refere-se mesma estrutura declarada
anteriormente com a etiqueta exem.

() Elementos de programao em C 24 / 57
Estruturas e unies Tipo unio

Tipo unio

As unies permitem o armazenamento seletivo de valores de diversos


tipos em um mesmo espao de memria.
Na especificao de uma unio, seus componentes no podem ser
iniciados nem possuir classe de armazenamento.

Vlida Invlida
union { union {
char cod , tp ; char cod , tp ;
int valor ; static int valor ;
double taxa ; double taxa = 2.3;
} }

() Elementos de programao em C 25 / 57
Estruturas e unies Tipo unio

Tipo unio

Cada especificao define um tipo unio diferente, mesmo que as


especificaes sejam idnticas.
Exemplo

union { union {
int a ; int a ;
char b ; char b ;
} aux , cod ; } taxa ;

As variveis aux e cod possuem o mesmo tipo, diferente do tipo da varivel


taxa.

() Elementos de programao em C 26 / 57
Estruturas e unies Tipo unio

Tipo unio

O uso de etiqueta permite referncias posteriores a um tipo unio j


declarado.
Exemplo

union exem {
int a ;
union exem taxa ;
char b ;
} aux , cod ;

Agora a varivel taxa possui o mesmo tipo que as variveis aux e cod.
A expresso union exem refere-se mesma unio declarada anteriormente
com a etiqueta exem.

() Elementos de programao em C 27 / 57
Estruturas e unies Campos de bits

Campos de bits
Os campos de bits so componentes de estruturas e unies
No so tipos de dados: apenas designam um nmero determinado de
bits interpretados como um valor d um tipo inteiro.
A quantidade de bits de um campo de bits no pode exceder o
tamanho do tipo inteiro especificado.

hDeclCampoBitsi ::= [ hQualifTipoi ] hTipoi [ hIdentificador i ] : hQtdBitsi

Exemplo

struct {
struct { union {
_Bool estado :1;
char op ; char op ;
char op ;
unsigned int valB : 5; int : 5;
int valA : 4;
} }
}

() Elementos de programao em C 28 / 57
Tipos incompletos

Tipos incompletos

Os tipos incompletos no possuem informao suficiente para determinar o


espao necessrio para armazenar seus valores em memria. Ocorrem
quando se especifica:

um tipo vetor sem definio de tamanho,


um tipo estrutura de contedo desconhecido,
um tipo unio de contedo desconhecido,
um tipo enumerado sem declarar suas constantes, ou
o tipo void.

() Elementos de programao em C 29 / 57
Tipos incompletos

Tipos incompletos

Os tipos incompletos no possuem informao suficiente para determinar o


espao necessrio para armazenar seus valores em memria. Ocorrem
quando se especifica:

um tipo vetor sem definio de tamanho,


um tipo estrutura de contedo desconhecido,
um tipo unio de contedo desconhecido,
um tipo enumerado sem declarar suas constantes, ou
o tipo void.

void
Especifica um conjunto de valores vazio. um tipo incompleto que no
pode ser completado.

() Elementos de programao em C 29 / 57
Representao dos valores

Representao dos valores

Todos os tipos em C, exceto os campos de bits, so armazenados como


uma sequncia contgua de um ou mais bytes.
Exemplo
Em uma arquitetura em que o tamanho do byte 7 bits, o armazenamento
de valores de um tipo que ocupa 12 bits requer dois bytes, resultando em 2
bits no utilizados:

byte byte
x x 0 0 1 1 0 0 0 0 0 1 0 1

O caractere x representa os bits no utilizados.

() Elementos de programao em C 30 / 57
Representao dos valores

Valorao e preenchimento

Bits de valorao. Usados para a interpretao do valor armazenado.


Bits de preenchimento. No utilizados

Bits de
preenchimento valorao

A preciso de um tipo inteiro o nmero de bits usado para


representar os seus valores, excluindo os bits de sinal e preenchimento.
O tamanho o nmero de bits de valorao mais o bit de sinal.

() Elementos de programao em C 31 / 57
Representao dos valores

Alinhamento dos bits

Cada tipo possui um requisito de alinhamento que indica como os


valores do tipo devem ser alocados.
O alinhamento de cada tipo depende da implementao e expresso
como um mltiplo de byte.

() Elementos de programao em C 32 / 57
Representao dos valores Representao dos inteiros

Representao dos inteiros no sinalizados

Representados por bits de valorao e preenchimento.


O contedo dos bits de preenchimento no especificado pelo padro.

() Elementos de programao em C 33 / 57
Representao dos valores Representao dos inteiros

Representao dos inteiros no sinalizados

Representados por bits de valorao e preenchimento.


O contedo dos bits de preenchimento no especificado pelo padro.

Exemplo
Se o tamanho do byte igual a 7 bits e o tipo unsigned short definido
com 8 bits, ento todo valor desse tipo ocupa 14 bits.
A tabela a seguir mostra duas possveis configuraes de bits para
armazenar o valor 73:

Preenchimento Valorao
0 0 0 0 0 0 0 1 0 0 1 0 0 1
0 1 0 1 0 1 0 1 0 0 1 0 0 1

() Elementos de programao em C 33 / 57
Representao dos valores Representao dos inteiros

Representao dos inteiros sinalizados

Representados por bits de sinal, valorao e preenchimento.


O contedo dos bits de preenchimento no especificado pelo padro.

() Elementos de programao em C 34 / 57
Representao dos valores Representao dos inteiros

Representao dos inteiros sinalizados

Representados por bits de sinal, valorao e preenchimento.


O contedo dos bits de preenchimento no especificado pelo padro.

Exemplo
Se o tamanho do byte igual a 7 bits e o tipo signed short definido
com 8 bits, ento todo valor desse tipo ocupa 14 bits.
A tabela a seguir mostra duas possveis configuraes de bits para
armazenar o valor 84 (negativos em complemento-2):

Sinal
Preenchimento Valorao
1 0 0 0 0 0 0 0 1 0 1 1 0 0
1 0 1 0 1 0 1 0 1 0 1 1 0 0

() Elementos de programao em C 34 / 57
Representao dos valores Caracteres

Representao dos caracteres

Os tipos caracteres so sempre armazenados em 1 byte.


No possuem bits de preenchimento.

() Elementos de programao em C 35 / 57
Representao dos valores Estruturas e unies

Representao de estruturas

A representao de uma estrutura corresponde alocao ordenada


dos seus componentes.
Pode haver bits de preenchimento no interior ou no final da estrutura.

() Elementos de programao em C 36 / 57
Representao dos valores Estruturas e unies

Representao de estruturas

A representao de uma estrutura corresponde alocao ordenada


dos seus componentes.
Pode haver bits de preenchimento no interior ou no final da estrutura.

Exemplo

struct {
Considerando os alinhamentos: float val ;
float = 4 bytes, char = 1 byte, char estado ;
estrutura = 4 bytes float juro ;
} aux ;

val estado juro

4 bytes 4 bytes 4 bytes

() Elementos de programao em C 36 / 57
Representao dos valores Estruturas e unies

Representao de unies

A memria alocada a uma unio corresponde ao espao necessrio


para armazenar o maior de seus componentes.
A representao varia segundo o componente armazenado.

() Elementos de programao em C 37 / 57
Representao dos valores Estruturas e unies

Representao de unies

A memria alocada a uma unio corresponde ao espao necessrio


para armazenar o maior de seus componentes.
A representao varia segundo o componente armazenado.

Exemplo

Considerando os alinhamentos: union exem {


char sit ;
float = 4 bytes, char = 1 byte, float sal ;
unio = 4 bytes } aux ;

sit
sal

4 bytes

() Elementos de programao em C 37 / 57
Representao dos valores Campos de bits

Representao de campos de bits

So alocados em unidades endereveis de memria.


Se um campo no cabe na unidade corrente, uma nova unidade
alocada.
Um campo de bits podem ou no cruzar as unidades de
endereamento (comportamento dependente da implementao).

() Elementos de programao em C 38 / 57
Representao dos valores Campos de bits

Campos de bits

Exemplo

struct {
Considerando o tamanho da unidade int cbA : 3;
int cbB : 2;
enderevel = 8 bits. int cbC : 6;
}

A alocao do campo cbC pode ocorrer como:

unidade armazenamento unidade armazenamento


a a a b b - - - c c c c c c - -

ou como:

unidade armazenamento unidade armazenamento


a a a b b c c c c c c - - - - -

() Elementos de programao em C 39 / 57
Converso de tipos

Converso de tipos

Expansiva
Restritiva

() Elementos de programao em C 40 / 57
Converso de tipos Tipo inteiro em tipo inteiro

Tipo inteiro em tipo inteiro

1 Se o valor original pode ser representado no novo tipo, ento o novo


valor idntico ao valor original.
2 Se o valor original no pode ser representado, ento
Se o novo tipo no sinalizado, o valor original reduzido mdulo 2N ,
onde N o tamanho do tipo alvo.
Se o novo tipo sinalizado, a converso dependente da
implementao, podendo no ser realizada e provocar um sinal de erro.
Observao. O compilador gcc estende o procedimento de reduzir um
valor mdulo 2N : o fator 2N adicionado ao (ou subtrado do) valor
original at que este esteja na faixa de representao do tipo alvo.

() Elementos de programao em C 41 / 57
Converso de tipos Tipo inteiro em tipo inteiro

Tipo inteiro em tipo inteiro

Reduo mdulo 2N
Equivale a subtrair 2N do valor, repetidas vezes, at que o resultado
esteja na faixa [0, 2N 1].

Se o valor original for negativo, deve-se adicionar 2N repetidas vezes.

A reduo mdulo 2N definida quando o tipo do valor reduzido no


negativo.

() Elementos de programao em C 42 / 57
Converso de tipos Tipo inteiro em tipo inteiro

Tipo inteiro em tipo inteiro

Exemplo
Considerando o tamanho do tipo unsigned short int = 16, converter o
valor 73.538 do tipo int no tipo unsigned short int.

() Elementos de programao em C 43 / 57
Converso de tipos Tipo inteiro em tipo inteiro

Tipo inteiro em tipo inteiro

Exemplo
Considerando o tamanho do tipo unsigned short int = 16, converter o
valor 73.538 do tipo int no tipo unsigned short int.

O valor original reduzido mdulo 216 = 65.536:

73.538 + 65.536 + 65.536 = 57.534


O valor 57.354 do tipo unsigned short int o resultado da reduo.

() Elementos de programao em C 43 / 57
Converso de tipos Tipo inteiro em tipo inteiro

Tipo inteiro em tipo inteiro

Exemplo

# include < stdio .h >


int main ( void ) {
Considerando o tamanho do
int a = -896;
tipo signed char = 8, qual signed char b ;
o resultado do programa ao b = a;
printf ("% d -> % hhd \ n " , a , b );
lado? return 0;
}

() Elementos de programao em C 44 / 57
Converso de tipos Tipo inteiro em tipo inteiro

Tipo inteiro em tipo inteiro

Exemplo

# include < stdio .h >


int main ( void ) {
Considerando o tamanho do
int a = -896;
tipo signed char = 8, qual signed char b ;
o resultado do programa ao b = a;
printf ("% d -> % hhd \ n " , a , b );
lado? return 0;
}

Pelo padro o resultado no definido.


O compilador gcc adota a reduo mdulo 28 , como uma extenso do
padro:

896 + 256 + 256 + 256 = 128

() Elementos de programao em C 44 / 57
Converso de tipos Tipo inteiro em tipo inteiro

Converses expansivas

signed char short int, int, long int ou long long int
short int int, long int ou long long int
int long int ou long long int
long int long long int
unsigned char unsigned short int, unsigned int,
unsigned long int ou unsigned long long int
unsigned short int unsigned int, unsigned long int ou
unsigned long long int
unsigned int unsigned long int ou unsigned long long int
unsigned long int unsigned long long int

() Elementos de programao em C 45 / 57
Converso de tipos Tipo inteiro em tipo real de ponto flutuante

Tipo inteiro em tipo real de ponto flutuante

1 Se o valor puder ser representado exatamente no novo tipo, ele


adotado sem modificao.
2 Se o valor estiver na faixa de representao do novo tipo, mas no
puder ser representado exatamente, o resultado ou o valor
representvel imediatamente superior ou o imediatamente inferior
(dependente da implementao).
3 Se o valor estiver fora da faixa de representao do novo tipo, o
comportamento indefinido.

() Elementos de programao em C 46 / 57
Converso de tipos Tipo inteiro em tipo real de ponto flutuante

Tipo inteiro em tipo real de ponto flutuante

Exemplo
Considerando que o tipo float possui expoente de 8 e mantissa de 23
dgitos, os trs inteiros representveis exatamente a partir de
224 = 16.777.216 so:
representao binria
s expoente mantissa valor decimal
0 10010111 00. . . 00 = (1 + 0 21 + . . . + 0 223 ) 224 = 16.777.216
0 10010111 00. . . 01 = (1 + 0 21 + . . . + 1 223 ) 224 = 16.777.218
0 10010111 00. . . 10 = (1 + 0 21 + . . . + 1 222 ) 224 = 16.777.220

Assim, a converso do inteiro 16.777.217 em um valor do tipo float


resultar no valor 16.777.216,0 ou no valor 16.777.218,0.

() Elementos de programao em C 47 / 57
Converso de tipos Tipo real de ponto flutuante em tipo inteiro

Tipo real de ponto flutuante em tipo inteiro

1 Se o valor da parte inteira pode ser representado no novo tipo, a parte


fracionria descartada e o valor do novo tipo idntico ao valor da
parte inteira.
2 Se o valor da parte inteira no pode ser representado no novo tipo, o
comportamento indefinido.

() Elementos de programao em C 48 / 57
Converso de tipos Tipo real de ponto flutuante em tipo inteiro

Tipo real de ponto flutuante em tipo inteiro

Exemplo
Usando complemento-2 para representar os valores negativos e
considerando o tamanho do tipo short int = 16 bits, Os valores desse
tipo esto na faixa [32.768, 32.767].
Logo,

O valor 32.600,234 do tipo double convertido em 32.600 do tipo


short int.
A converso do valor 40.000,00 do tipo double em um valor do tipo
short int indefinida.

() Elementos de programao em C 49 / 57
Converso de tipos Real de ponto flutuante em Real de ponto flutuante

Tipo real de ponto flutuante em tipo real de ponto flutuante

1 Se o valor puder ser representado exatamente no novo tipo, ele


adotado sem modificao.
2 Se o valor est na faixa de representao do novo tipo mas no pode
ser representado exatamente, o resultado ou o valor representvel
imediatamente superior ou o imediatamente inferior (dependente da
implementao).
3 Se o valor est fora da faixa de representao do novo tipo, o
resultado indefinido.

() Elementos de programao em C 50 / 57
Converso de tipos Real de ponto flutuante em Real de ponto flutuante

Tipo real de ponto flutuante em tipo real de ponto flutuante

1 Se o valor puder ser representado exatamente no novo tipo, ele


adotado sem modificao.
2 Se o valor est na faixa de representao do novo tipo mas no pode
ser representado exatamente, o resultado ou o valor representvel
imediatamente superior ou o imediatamente inferior (dependente da
implementao).
3 Se o valor est fora da faixa de representao do novo tipo, o
resultado indefinido.
As seguintes converses so expansivas:

float double ou long double


double long double

() Elementos de programao em C 50 / 57
Converso de tipos Envolvendo tipos complexos

Converses envolvendo tipos complexos

Tipo real em tipo complexo


O valor real convertido na parte real do tipo complexo segundo as
regras aplicveis.
A parte imaginria zero (positivo ou no sinalizado).

() Elementos de programao em C 51 / 57
Converso de tipos Envolvendo tipos complexos

Converses envolvendo tipos complexos

Tipo real em tipo complexo


O valor real convertido na parte real do tipo complexo segundo as
regras aplicveis.
A parte imaginria zero (positivo ou no sinalizado).

Tipo complexo em tipo real


A parte real do tipo complexo convertida no valor real segundo as
regras aplicveis.
A parte imaginria descartada.

() Elementos de programao em C 51 / 57
Converso de tipos Envolvendo tipos complexos

Converses envolvendo tipos complexos

Tipo real em tipo complexo


O valor real convertido na parte real do tipo complexo segundo as
regras aplicveis.
A parte imaginria zero (positivo ou no sinalizado).

Tipo complexo em tipo real


A parte real do tipo complexo convertida no valor real segundo as
regras aplicveis.
A parte imaginria descartada.

Tipo complexo em tipo complexo


As partes real e imaginria so convertidas segundo as regras
aplicveis aos tipos reais correspondentes.

() Elementos de programao em C 51 / 57
Converso de tipos Envolvendo o tipo booliano

Converses envolvendo o tipo booliano

Tipo escalar em tipo _Bool


Resulta no valor 0 se o valor original for igual a 0.
Resulta no valor 1, em caso contrrio.

() Elementos de programao em C 52 / 57
Converso de tipos Envolvendo o tipo booliano

Converses envolvendo o tipo booliano

Tipo escalar em tipo _Bool


Resulta no valor 0 se o valor original for igual a 0.
Resulta no valor 1, em caso contrrio.

Tipo _Bool em tipo escalar


Resulta no valor original (0 ou 1), sem perda de informao.

() Elementos de programao em C 52 / 57
Promoo inteira

Promoo inteira

Ocorre sempre que um valor de um tipo int ou unsigned int esperado


em alguma situao e o valor fornecido
de um tipo de menor ordem, ou
um campo de bits do tipo _Bool, int, signed int ou unsigned
int.

Regra
Se o valor puder ser representado como um valor do tipo int, ele
convertido em int. Caso contrrio, ele convertido em unsigned int.

() Elementos de programao em C 53 / 57
Promoo inteira Ordenamento de inteiros

Ordenamento de inteiros

O ordenamento dos tipos inteiros utilizado na promoo inteira e nas


converses de valores.
Os tipos inteiros sinalizados so ordenados pela preciso:
signed char < short int < int < long int < long long int

Os tipos inteiros no sinalizados possuem ordem igual do tipo


sinalizado correspondente:
unsigned char < unsigned short int < unsigned int <
unsigned long int < unsigned long long int

O tipo _Bool possui ordem menor que a dos demais inteiros.


A ordem do tipo char igual dos tipos signed char e unsigned char.

A ordem dos tipos estendidos dependente da implementao.

() Elementos de programao em C 54 / 57
Compatibilidade de tipos

Compatibilidade de tipos
Os tipos em uma mesma linha so compatveis representam o mesmo
tipo:
void.
char.
signed char.
unsigned char.
short, signed short, short int e signed short int.
unsigned short e unsigned short int.
int, signed e signed int.
unsigned e unsigned int.
long, signed long, long int e signed long int.
unsigned long e unsigned long int.
long long, signed long long, long long int e signed long long int.
unsigned long long e unsigned long long int.
float.
double.
long double.
_Bool.
float _Complex.
double _Complex.
long double _Complex.
() Elementos de programao em C 55 / 57
Tipos predefinidos

Tipos predefinidos

Tipo Finalidade Declarao


Tipo booliano idntico a _Bool.
bool stdbool.h
Tipo inteiro no sinalizado, representa tamanhos.
size_t stddef.h
stdlib.h
wchar.h
Tipo inteiro sinalizado, representa diferena entre
ptrdiff_t stddef.h
ponteiros.
Tipo do maior inteiro sinalizado.
intmax_t stdint.h
Tipo do maior inteiro no sinalizado.
uintmax_t stdint.h
Tipo inteiro usado para representar caracteres es-
wchar_t stddef.h
tendidos.
stdlib.h
wchar.h

() Elementos de programao em C 56 / 57
Bibliografia

Bibliografia

ISO/IEC
C Programming Language Standard
ISO/IEC 9899:2011, International Organization for Standardization;
International Electrotechnical Commission, 3rd edition, WG14/N1570
Committee final draft, abril de 2011.
Francisco A. C. Pinheiro
Elementos de programao em C
Bookman, Porto Alegre, 2012.
www.bookman.com.br, www.facp.pro.br/livroc

() Elementos de programao em C 57 / 57

You might also like