theme: white transition: convex
Aula 02 - Representação de Dados
Apresentação
Ao cruzar a fronteira entre software e a CPU, descobrimos que não existem “Strings” ou “Imagens”, existem apenas correntes elétricas ligadas ou desligadas (1s e 0s). Vamos analisar a estrutura sob a ótica de C/C++.
Novo Tópico
🔢 1. Sistema Binário e Hexadecimal
🔢 1. Sistema Binário e Hexadecimal
O computador compreende nativamente a base 2 (Binário). Como a escrita binária é muito longa para os humanos, nós a agrupamos em Blocos de 4 (Base 16 - Hexadecimal).
- Bit: 0 ou 1
- Byte: 8 bits (
00000000a11111111, indo de 0 a 255 no decimal)
🔢 1. Sistema Binário e Hexadecimal
Por que Hexadecimal é amado pelos desenvolvedores C/C++? Um Byte (8 bits) pode ser perfeitamente representado por exatos dois caracteres Hexadecimais. FF é o mesmo que 11111111.
🔢 1. Sistema Binário e Hexadecimal
$ # Como você lida com Hex no C++?
$ cat var.cpp
int mascara_de_bits = 0xFF; // Representa 255🔢 1. Sistema Binário e Hexadecimal
Novo Tópico
🔋 2. Inteiros com e sem Sinal (Unsigned)
🔋 2. Inteiros com e sem Sinal (Unsigned)
Em C/C++, o rigor nos tipos provém diretamente do hardware:
🔋 2. Inteiros com e sem Sinal (Unsigned)
int x = 255; // Geralmente um int é 32 bits, comportando valores grandes, podendo ser negativo (signed).
unsigned char y = 255; // 8 bits sem sinal (0 a 255)
signed char z = -1; // 8 bits com sinal (-128 a 127)🔋 2. Inteiros com e sem Sinal (Unsigned)
No hardware, inteiros negativos são representados usando a regra de Complemento de 2. Para obtermos o binário do -1, invertemos todos os bits de 1 e somamos 1.
🔋 2. Inteiros com e sem Sinal (Unsigned)
WARNING
Sempre avalie Overshoot. Um loop usando
unsigned int i = 10; while(i >= 0)será um loop infinito, porque quandoiatingir 0 e for subtraído, ele NUNCA ficará negativo; ele executará o “Wrap-around” arquitetural, voltando ao valor limite de (4.294.967.295).
🔋 2. Inteiros com e sem Sinal (Unsigned)
Novo Tópico
🧮 3. Ponto Flutuante (IEEE 754)
🧮 3. Ponto Flutuante (IEEE 754)
Os famosos tipos float e double. O processador possui normalmente um setor dedicado de FPU (Floating Point Unit) para eles.
A representação oficial IEEE 754 os divide em 3 porções:
🧮 3. Ponto Flutuante (IEEE 754)
flowchart LR A["Sinal (1 bit)"] --- B["Expoente (8 bits)"] --- C["Fração/Mantissa (23 bits)"] style A fill:#ff9999 style B fill:#99ccff style C fill:#ccffcc
🧮 3. Ponto Flutuante (IEEE 754)
O Perigo da Precisão!
🧮 3. Ponto Flutuante (IEEE 754)
CAUTION
Ao somar decimais repetidamente, as variações de mantissa geram margens de erro:
0.1 + 0.2raramente é exatamente0.3na FPU, mas sim0.30000000000000004! Evite comparadores igualitários (==) em floats. Jamais use floats transacionando valores bancários estritos em backend, use estruturas customizadas dimensionais inteiras.
Novo Tópico
🚀 Resumo Prático
🚀 Resumo Prático
A maneira como você escolhe o tipo primitivo da variável modela a fisionomia do registrador acionado na máquina durante o fetch. Entender o Overflow é a proteção básica contra corrupção lógica do código.