Então, se char
for 1 byte
, são 8 bits, certo?
Então 2 ^ 8 = 256 e 0 a 255 é o intervalo de caracteres?
Como isso funciona com entradas assinadas e não assinadas? Um int tem 4 bytes, então 32 bits, então 2 ^ 32
. 2 ^ 31 - 1 fornece o intervalo positivo de inteiros assinados, então o que acontece com o 32º bit? É usado para o sinal? Como um sinal seria armazenado na memória?
Responder1
Se o tipo de dados for definido como um tipo assinado, existem diferentes tipos de representação - principalmente a representação de magnitude com sinal e a representação em complemento de dois.
Para representação de magnitude com sinal, sim, o bit de sinal foi armazenado como o bit mais significativo (MSB, ou seja, o bit mais à esquerda). MSB de 0 representa um valor positivo, enquanto 1 representa um valor negativo. Exemplo:
7 = 00000111
-7 = 10000111
Isso é simples e (relativamente) legível por humanos, porém os tipos inteiros geralmente sãonãomantido desta forma por dois problemas:
(1) Existem duas representações para zero, +0 e -0. Isso torna difícil comparar números, pois cria um caso especial.
(2) Não é fácil fazer cálculos (tão simples como somar e subtrair). Adicionar dois números positivos, um número positivo a um número negativo, um número negativo a um número positivo e adicionar dois números negativos são quatro casos de uso diferentes. por exemplo, 7+6 é direto
1 Carry bit
7 = 00000111
6 = 00000110 (Logic for add)
.. ........
13 = 00001101
Ao calcular 7+(-6) significa que a lógica de subtração será usada
7 = 00000111
-6 = 10000110 (Logic for subtraction)
.. ........
1 = 00000001
O intervalo para um número de 8 bits é, portanto, -(2^7)+1 a 2^7-1 (ou seja, -127 a +127, com dois zeros +0 e -0). A representação de magnitude sinalizada é usada principalmente para manter números flutuantes.
E isso leva à representação em complemento de dois. Os números positivos são representados da mesma forma que a representação de magnitude com sinal. A alteração do bit de sinal leva duas etapas: (1) Inverter todos os bits (alterar todos os 0 para 1 e 1 para 0) (2) Adicionar um.
Exemplo, para obter a representação de -6, seguimos os seguintes passos
6 = 00000110
Invert all bits: 11111001
Add one: 11111010
Então -6 é representado como 11111010
. Com a representação em complemento de dois, você ainda pode ler o sinal do MSB; embora haja apenas uma representação para zero: 00000000
.
Também é fácil fazer cálculos com números binários na representação em complemento de dois - somar é somar. Vamos ver novamente como funciona calcular 7+(-6):
1111111 Carry bit
7 = 00000111
-6 = 11111010 (Logic for add)
.. ........
1 = 00000001
O intervalo para um número de 8 bits é, portanto, -(2^7) a 2^7-1 (ou seja, -128 a +127). Observe que o intervalo é diferente da representação da magnitude com sinal.