Publicado em C/C++, Low level, Tecnologia

The ‘Gangnam Style’ Bug

No momento de começar a escrever essa postagem, o vídeo “Gangnam Style” da estrela pop sul-coreana Psy no Youtube já tinha sido visualizado 2.565.002.912 vezes. Quase tantas vezes como foi acessado esse blog durante a última semana. Nada mal!

O número de visualizações deriva de um contador e, como todo contador, ele deve ter começado do zero e aumentado um por um até chegar aos pouco mais de 2,5 bilhões atuais. Em teoria, as visualizações não deveriam diminuir, pelo menos não em termos absolutos. Mas…

O vídeo mais e menos acessado -ao mesmo tempo- de todos os tempos

Mas o vídeo do Psy bateu vários recordes, incluídos o de mais e menos acessado ao mesmo tempo. De alguma maneira, ele conseguiu que o seu maior sucesso seja ‘não’ visualizado -2.142.584.554 (negativo) vezes. Observa a imagem, não estou mentindo:

psy-youtube-bug

E como ele conseguiu isso? Bom, na verdade não foi ele e sim os engenheiros de software da Google, a proprietária do Youtube.

Mas, o que seriam as visualizações negativas? Pessoas que ainda não assistiram o vídeo?

Os caras da Google não consideraram a possibilidade de um vídeo ser acessado mais do que 2.147.483.647 vezes. Esse é o maior número inteiro (com signo) que pode ser representado num espaço de memória de apenas 32-bit (complemento a 2). Ultrapassada essa barreira, o contador continua aumentando, mas o faz a partir do menor número negativo inteiro que pode representar: -2.147.483.648. Se ninguém tivesse percebido, o contador poderia ter voltado a zero, e recomeçado tudo de novo.

Vamos tentar entender isto com números menores e mais amigáveis. O valor máximo possível de ser representado com um inteiro (com signo) de 8-bit é:

(2^7) - 1 = 127

O valor mínimo (complemento a 2):

-(2^7) = -128

Veja como funcionaria o contador, começando de zero, chegando ao máximo positivo, atravessando a barreira dos 8-bit e recomeçando a partir do mínimo negativo, até chegar de novo ao zero:

0000_0000 --> 0
0000_0001 --> 1
0000_0010 --> 2
...
0111_1101 --> 125
0111_1110 --> 126
0111_1111 --> 127
------------- A barreira do maior positivo
1000_0000 --> -128
1000_0001 --> -127
1000_0010 --> -126
...
1111_1101 --> -3
1111_1110 --> -2
1111_1111 --> -1
0000_0000 --> 0

Nesse pequeno código em C, uma variável de tipo ‘char’ com signo (8-bit no meu computador), vai assumir sucessivamente valores entre 0 e 256; mas, a saída standard vai imprimir a sequência 0..127, -128..0.

  #include <stdio.h>

  signed char schar = 0;

  int main()
  {
    for( int i = 0; i <= 256; i++ )
    {
      printf( "%hhd ", schar++ );
    }
    printf( "\n" );
    return 0;
  }

O que fazer?

Qual a solução? O que eles fizeram foi mudar o tipo de inteiro do contador para 64-bit com signo. Assim, o máximo possível antes de passar a barreira e aparecer do outro lado do Universo, seria de 9.223.372.036.854.775.807. E rezar para que nenhum fenômeno pop do futuro fure o limite de novo. Para isso acontecer, cada ser humano do planeta deveria assistir pelo menos 1 bilhão de vezes o vídeo.

Não sei por quê que eles teimam em usar um tipo de inteiro com signo, sendo que o contador não precisa… se ele só pode aumentar. Enquanto isso, eu, como sou precavido, estou pensando a possibilidade de mudar o contador de visitas do blog para 128-bit.

Veja também: inteiros, sonhos, ovelhas e androides

 

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.