Bytes, números e caracteres

01000010 01111001 01110100 01100101 01110011 00101100 00100000
01101110 01110101 01101101 01100101 01110010 01101111 01110011
00100000 01100101 00100000 01100011 01100001 01110010 01100001
01100011 01110100 01100101 01110010 01100101 01110011 00001010

A memória de qualquer computador é uma sequência de bytes.  Cada byte é uma sequência de 8 bits (dígitos binários) e portanto tem 28 = 256 possíveis valores:

00000000 00000001 00000010 ⋮ 11111110 11111111

Uma sequência de bytes consecutivos na memória pode ser interpretada de três diferentes maneiras:

Este capítulo discute essas três interpretações.

Sumário:

Números naturais e notação binária

Toda sequência de bits pode ser vista como um número natural em notação binária:  o número natural é a soma das potências de 2 que correspondem aos bits 1.  Por exemplo, a sequência  1101  representa o número  23 + 22 + 20,  igual a 13.  A sequência  1111  representa  23 + 22 + 21 + 20,  igual a 15.

Toda sequência de s bytes — ou seja, 8s bits — representa um número natural no intervalo fechado

0 . . 28s−1.

Se s = 1, por exemplo, o intervalo vai de 0 a 28−1, isto é, de 0 a 255.  Se s = 2, o intervalo vai até 216−1, isto é, até 65535.  Se s = 4, o intervalo vai até 232−1, isto é, até 4294967295.

Exemplo.  Para que o exemplo caiba na página, vamos tomar s = 1 e fingir que cada byte tem apenas 4 bits. Uma sequência de 4 bits representa, em notação binária, um número no intervalo  0 . . 24−1:

byte número
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15

Exercícios 1

  1. Mostre que todo número natural pode ser escrito em notação binária.
  2. Mostre que  2k + 2k−1 + … + 21 + 20 = 2k+1−1, qualquer que seja o número natural k.
  3. Escreva os números 28, 28−1, 216, 216−1, 232 e 232−1 em notação hexadecimal.

Números inteiros e notação complemento-de-dois

Seja s um número natural não nulo. Toda sequência de s bytes — ou seja, 8s bits — pode ser interpretada como um número inteiro no intervalo fechado

−28s−1 . .  28s−1−1 .

Se s = 1, por exemplo, esse intervalo vai de −27 a 27−1, isto é, de −128 a 127.  Se s = 2, o intervalo vai de −215 a 215−1, isto é, de −32768 a 32767.  Se s = 4, o intervalo vai de −231 a 231−1, isto é, de −2147483648 a 2147483647.

Qual o número inteiro que uma dada sequência de 8s bits representa?  Comece por interpretar a sequência como um número natural em notação binária. Digamos que esse número é n. Se o primeiro bit da sequência é 0, ela representa o inteiro positivo n. Se o primeiro bit é 1, a sequência representa o inteiro estritamente negativo  n − 28s.  Essa maneira de representar inteiros é conhecida como notação complemento-de-dois (= two's complement).

Exemplo.  Para que o exemplo caiba na página, vamos tomar s = 1 e fingir que cada byte tem apenas 4 bits. Uma tal sequência de bits representa um número inteiro no intervalo −23 . . 23−1 :

byte inteiro
0000 +0
0001 +1
0010 +2
0011 +3
0100 +4
0101 +5
0110 +6
0111 +7
1000 −8
1001 −7
1010 −6
1011 −5
1100 −4
1101 −3
1110 −2
1111 −1

Exercícios 2

  1. Complemento de n.  Mostramos acima como a notação complemento-de-dois transforma qualquer sequência de s bytes cujo primeiro bit é 1 em um inteiro negativo. Agora considere a operação inversa. Dado um inteiro n no intervalo −28s−1 . . −1, mostre que a sequência de s bytes que representa n em notação complemento-de-dois é a mesma sequência de bytes que representa n + 28s em notação binária.
  2. Complemento-de-dois.  A notação complemento-de-dois transforma qualquer sequência de s bytes cujo primeiro bit é 1 em um inteiro negativo. Agora considere a operação inversa. Suponha que n é um inteiro no intervalo −28s−1 . . −1. Tome a sequência de bits que representa o valor absoluto de n em notação binária; complemente todos os bits (ou seja, troque 0 por 1 e 1 por 0), e some 1, em binário, ao resultado. Mostre que essa operação produz a sequência de s bits que representa n em notação complemento-de-dois.
  3. Uma alternativa para complemento-de-dois?  Suponha, como fizemos no exemplo acima, que dispomos de apenas 4 bits para representar números inteiros. Agora adote a seguinte maneira de interpretar uma sequência de 4 bits. Seja n o número inteiro positivo que os 3 últimos bits representam em notação binária. Se o primeiro bit é 0, então a sequência toda representa o número positivo n. Se o primeiro bit é 1, então a sequência toda representa o número negativo n.  (Por exemplo, a sequência 1101 representa −5.)  Discuta as desvantagens dessa representação de números inteiros.
  4. Escreva os números 27, 27−1, 215, 215−1, 231 e 231−1 em notação hexadecimal.

Caracteres e a tabela ASCII

Um caractere é qualquer símbolo tipográfico (letra, dígito, sinal de pontuação, etc.).  Veja alguns exemplos de caracteres:  @, A, B, C, a, b, c, +, -, *, /, =, Á, Ã, à, ç, é, ô, ≤, ≠ (Não confunda o conceito de caractere com o tipo char da linguagem C.)

Neste capítulo, tratamos apenas do pequeno conjunto de 128 caracteres conhecido como alfabeto ASCII. Esse conjunto inclui os caracteres

   ! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 
: ; < = > ? @
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
[ \ ] ^ _ `
a b c d e f g h i j k l m n o p q r s t u v w x y z
{ | } ~

e mais alguns (o primeiro caractere da lista acima é um espaço em branco).

Todo byte cujo primeiro bit é 0 representa um caractere do alfabeto ASCII. A correspondência entre os bytes e os caracteres é definida pela tabela ASCII. Eis uma pequena amostra da tabela:

byte caractere
00111111 ?
01000000 @
01000001 A
01000010 B
01000011 C
01100001 a
01100010 b
01100011 c
01111110 ~

É cômodo usar atalhos verbais ao falar de caracteres ASCII.  Por exemplo, em vez de dizer o caractere A podemos dizer o caractere 65, pois o byte que corresponde a A na tabela ASCII representa 65 em notação binária.

Caracteres de controle.  Além dos noventa e cinco caracteres normais, o alfabeto ASCII contém trinta e três caracteres de controle. Esses caracteres não são símbolos tipográficos como os outros e por isso precisam ser indicados por uma notação especial: uma barra invertida seguida de um dígito ou letra. Eis os caracteres de controle mais usados:

byte caractere nome
00000000 \0 caractere nulo (null)
00001001 \t tabulação horizontal (tab)
00001010 \n fim de linha (newline)
00001011 \v tabulação vertical
00001100 \f fim de página (new page)
00001101 \r carriage return

O caractere  \0  é usado para marcar o fim de uma string e não ocupa espaço algum ao ser exibido; o caractere  \n  marca o fim de uma linha de texto e produz uma mudança de linha ao ser exibido; o caractere  \f  marca o fim de uma página; e assim por diante.  Embora o espaço em branco não seja um caractere de controle, ele pode ser indicado por (barra invertida seguida de um espaço).

Os caracteres  \t\n\v\f  e  \r  são conhecidos coletivamente como brancos (= white-spaces). Muitas funções das bibliotecas padrão tratam todos os brancos como se fossem espaços.

Caracteres não-ASCII.  O alfabeto ASCII não contém letras com sinais diacríticos, como Á, Ã, à, ç, é, ô, etc.  Cada uma dessas letras é representada por dois ou mais bytes consecutivos num esquema de codificação conhecido como UTF-8.  Trataremos disso no capítulo Strings e cadeias de caracteres e no capítulo Unicode e UTF-8.

Exercícios 3

  1. Quais são os bytes que representam os caracteres  O,  o,  0  e  \0 ?
  2. Escreva os bytes 01000001, 01000010 e 01000011 em notação hexadecimal.
  3. Escreva, em notação decimal, a sequência de bytes que representa o texto  Um byte tem 8 bits..
  4. Considere os bytes que representam os números naturais  65 67 72 79 85 33 10 51 50 32 43 32 52 51 32 61 32 55 53  em notação binária.  Qual a sequência de caracteres representada por essa sequência de bytes?
  5. A epígrafe no início desta página é uma sequência de bytes que representam caracteres ASCII. Decodifique a epígrafe.
  6. Inspeção de bytes.  Familiarize-se com os programas od e hexdump (os nomes são abreviaturas de octal dump e hexadecimal dump).  Esses utilitários exibem, byte-a-byte, o conteúdo de qualquer arquivo dado.

Perguntas e respostas