<AlissonB> FabioOlive, outra dúvida: http://www.bertochi.com.br/files/imagens/bits_a_esquerda.png
<AlissonB> o que ele quer dizer com “binários que utilizam o bit mais a esquerda”?
<FabioOlive> marlon: o AlissonB e eu esbarramos num bug da scanf(). se tu manda uma entrada que não casa com o padrão, as próximas chamadas da scanf() entram em loop sem ler uma nova linha
<marlon> Se não me engano é para representar numeros negativos
<FabioOlive> por isso que eu pensei em separar os dois passos
<marlon> unsigned é para numeros tipo de 256 ser -128 ate 127 e signed seria do 0 a 255
<FabioOlive> AlissonB: significa que o bit mais à esquerda pode ser interpretado como o sinal do número, se for um int (ou outro tipo inteiro). Se tu declarar uma variável int e colocar nela o valor 10000000'00000000'00000000'00000000 ela vai ser o número mais negativo representável em um int de 32bits
<FabioOlive> pensa assim
<FabioOlive> só tem bit nessa melda
<FabioOlive> computador é burro pacas
<FabioOlive> tudo é bit
<marlon> Ai para representar os negativos vai começa com 1 a esquerda para ser representado
<FabioOlive> e os bits não são mágicos nem infinitor
<FabioOlive> infinitos, digo
<FabioOlive> eles tão lá na memória
<FabioOlive> então se tu tem na memória uma variável de 32bits, vais armazenar lá 32 bits, e interpretar o que esses bits querem dizer depende do contexto
<FabioOlive> se o teu programa usa unsigned int, são 32 bits que podem representar de 0 até 2^32-1
<FabioOlive> se o teu programa usa int, então o bit mais na ponta vale como o sinal (na verdade o valor dele é -2^31)
<FabioOlive> é tudo uma questão de como interpretar os bits que estão lá
<FabioOlive> bit é bit, eles não carregam um marcador mágico que diga “eu sou um sinal!”
<FabioOlive> se tu pegar um valor negativo e colocar em uma variável unsigned, ele vai achar que é um valor bem grande ao invés de um valor negativo. :)
<FabioOlive> o processador não sabe o que é sinal e o que não é. é tudo bit, 0 e 1 na memória só
<marlon> FabioOlive: é mais o menos o que eu falei né? ou eu to viajando na maionese?
<AlissonB> em suma, em uma variável signed, o primeiro bit à esquerda sempre estará ligado?
<FabioOlive> quem tem que manter essa ilusão de que existem números negativos é o programador :)
<FabioOlive> AlissonB: não
<FabioOlive> AlissonB: só se o valor dela for negativo :)
<AlissonB> isso! :D
<FabioOlive> marlon: tu viajou um pouco :)
<_edEr> FabioOlive: mas o primeiro bit fica reservado pra essa finalidade ?
<AlissonB> boa pergunta _edEr++
<mibotz> _edEr tem 28 pontos de karma
<FabioOlive> não fica reservado
<FabioOlive> essa é uma boa pergunta mesmo _edEr++
<mibotz> _edEr tem 29 pontos de karma
<FabioOlive> vejam bem
<marlon> Manda ver ai FabioOlive :D
<FabioOlive> o bit lá da ponta vale uma potência de 2 “negativada” :)
<FabioOlive> vamos trabalhar com 8 bits pra facilitar
<FabioOlive> em um byte “sem sinal”, a gente sabe que os valores dos bits são (em ordem) 128 64 32 16 8 4 2 1
<FabioOlive> então em um byte cujos bits sejam 0 1 0 1 0 0 0 1 a gente soma 64 + 16 + 1 e chega no valor 81, certo?
<AlissonB> certo
<FabioOlive> então
<marlon> certo
<FabioOlive> se esse byte for “com sinal”, a gente faz de conta que o bit mais significativo, o da ponta esquerda, vale -128 ao invés de 128
<FabioOlive> então um valor como 1 1 0 0 1 0 1 0 ficaria -128 + 64 + 8 + 2, o que dá -54
<FabioOlive> vejamos se estou mentindo…
<marlon> Então quem faz este trabalho é o compilador ou o processador? ou nem um nem outro e é melhor eu ficar quietinho aqui ? ASHUASHAS
<AlissonB> huahuHHauhauhHUHAA
<FabioOlive> marlon: é o compilador que faz a mágica de fazer de conta que tem sinal. na verdade algumas instruções aritméticas do processador também fazem essa distinção, mas em geral não faz diferença
<marlon> Beleza (:
<AlissonB> muito bom!
<FabioOlive> $ cat negativo.c
<FabioOlive> #include <stdio.h>
<FabioOlive> int main() {
<FabioOlive> char byte = (char)0b11001010;
<FabioOlive> printf(”%d\n”, byte);
<FabioOlive> return 0;
<FabioOlive> }
<FabioOlive> $ gcc -o negativo negativo.c
<FabioOlive> $ ./negativo
<FabioOlive> -54
<FabioOlive> ufa!
<FabioOlive> achei que eu tinha errado hehehe
<AlissonB> 0b indica que é em binário?
<FabioOlive> sim
<FabioOlive> como 0x indica uma constante em hexa
<marlon> Muito boa explicação FabioOlive++ (:
<mibotz> FabioOlive tem 126 pontos de karma
<marlon> Obrigado õ/
<FabioOlive> que bom que gostaram! :)
<marlon> Galera, to indo para casa
<AlissonB> só uma dúvida, porque aquele cast pra char?
<marlon> Quando chegar entro no mirc lá :D
<AlissonB> valeu marlon
<marlon> irc * ASHHSAUASHUASH
<marlon> Abraços
<_edEr> abraço
<FabioOlive> AlissonB: só pra ter certeza que o compilador não ia reclamar :)
<AlissonB> testei sem FabioOlive, funfou também :)
<FabioOlive> legal
<FabioOlive> eu mudei o printf pra imprimir com e sem sinal :)
<FabioOlive> $ ./negativo
<FabioOlive> -54 4294967242
<FabioOlive> printf(”%d %u\n”, byte, byte);
<FabioOlive> :)
<FabioOlive> só muda a maneira de interpretar
<FabioOlive> (note que ele “promoveu” o char para um int na hora de imprimir)
<AlissonB> FabioOlive, mas esse número unsigned tá errado né o.O
<FabioOlive> não, esse número corresponde a 11111111'11111111'11111111'11001010 como um inteiro sem sinal :)
<FabioOlive> »> 0b11111111111111111111111111001010
<FabioOlive> 4294967242
<AlissonB> humm
<AlissonB> humm
<AlissonB> verdade, porque os inteiros tem 4 bytes né
<AlissonB> e o char é só 1 byte
<AlissonB> por isso tu salvou em um char
<AlissonB> :\o\
<FabioOlive> isso :)
<FabioOlive> pra facilitar e não ter que digitar os 32 bits todos
<AlissonB> agora as coisas estão fazendo sentido
<AlissonB> hehe
<FabioOlive> mas aí na hora de imprimir, o printf “promoveu” o char pra int, porque eu usei %d e %u que lidam com ints :)
<AlissonB> fantástico! FabioOlive++
<mibotz> FabioOlive tem 127 pontos de karma
<AlissonB> =D
<FabioOlive> e aí quando se estende um número de 8 bits pra 32, o último bit é repetido até o fim, para manter o sinal
<AlissonB> depois posto esse log lá no site
<_edEr> legal.. eu também tava confuso nessa
<_edEr> hehe
<_edEr> bacana o “atalho”
<_edEr> hehe
<AlissonB> FabioOlive, quem convencionou que o int é 4 bytes e o char é 1?
<FabioOlive> a história da computação ;)
<FabioOlive> em computadores de 16 bits, o int é de 16 bits
<FabioOlive> em arduinos, por exemplo, que são processadores de 8 bits, o int é 16 bits
<AlissonB> como assim? processador de 8 bits e o int é 16?
<FabioOlive> é que “int” é uma coisa do C, saca?
<AlissonB> humm
<AlissonB> mas as variáveis gerais em outras linguagens não funcionam da mesma forma?
<AlissonB> não alocam o mesmo espaço?
<FabioOlive> então se convencionou que o int seria sempre 16 ou 32 bits
<FabioOlive> o char é sempre 8
<FabioOlive> e o long é sempre 32 ou 64
<FabioOlive> AlissonB: depende muito :) um tipo numérico em python não tem um tamanho definido :)
<FabioOlive> ele pode ser astronomicamente grande e ocupar metade da tua memória :)
<FabioOlive> claro que aí não tem como usar operações nativas do processador nesses números em python
<FabioOlive> e o python precisa implementar tipos e operações mais abstratas, baseadas nas operações nativas, para fazer de conta que números muito grandes existem :)
<AlissonB> que doidera
<AlissonB> na tua palestra do boot, tu falou que o Arduino utiliza aquele outro conceito de arquitetura, acho que é Harvard o nome, ou algo assim
<AlissonB> não to lembrado
<AlissonB> não é o Von Neumann
<AlissonB> daí ele executa direto no processador?
<FabioOlive> não
<FabioOlive> AlissonB: o processador executa a memória, isso é assim pra todos os processadores
<FabioOlive> a arquitetura harvard separa o que é memória de programa do que é memória de dados
<AlissonB> ah tá
<marlon> Fabio, para os numeros mega grandes em python que fica responsavel por eles?
<AlissonB> boa marlon!
<FabioOlive> o python simula as operações, quebrando-as em 32 em 32 bits :)
<FabioOlive> tipo, pra somar dois números que estejam ocupando 128 bits ele quebra em 4 somas de 32, fazendo “vai um” entre elas :)
<marlon> Hmmm legal :D
<marlon> o python usa alguma maquina virtual ?
<marlon> Assim como o java
<FabioOlive> sim, usa uma VM de python :)
<FabioOlive> parecido com java :) a idéia do java não era nada nova :)
<FabioOlive> ele só tinha uma grande empresa por trás pra fazer marketing :)