Eu estava aprendendo a programar para um robô de obstáculo vazio , mas quando olhei para o code vi dois tipos de dados long e int.
Int são tipos de dados que contêm -2.147.483.648 a 2.147.483.647. Longos também são tipos de dados que armazenam -2.147.483.648 a 2.147.483.647.
Int e long são iguais, mas eu vim com o código em que dois tipos de dados são usados, conforme mostrado abaixo:
int trigPin = 2; int echoPin = 4; long duration, cm, inches;
Mas como você pode saber quando usar qual tipo de dados? Pesquisei muito na web, mas não entendi, então alguém pode me explicar isso.
Comentários
- ” Int são tipos de dados que contêm -2.147.483.648 a 2.147.483.647 ” Onde você ouviu isso?
Resposta
No Arduino (modelos AVR), um int
tem 16 bits, não 32 bits. Portanto, vai de -32768 a +32767.
Isso é diferente de long
que é de 32 bits.
Comentários
- Quais são as larguras de
int
elong
nos Arduinos ARM de 32 bits, como Devido? - Acho que no Devido um
int
tem 32 bits, o mesmo quelong
. Veja aqui por exemplo.
Resposta
int
em AVR GCC é 16 bits , não 32.
Resposta
De acordo com a especificação da linguagem C , int
deve ter pelo menos 16 bits ou mais e long
deve ter pelo menos 32 bits ou mais.
É normal para um compilador implementar int
como 32 bits ou mesmo 64 bits. É normal que um compilador implemente long
como 64 bits ou mais. Mas não é permitido a um compilador implementar long
como 16 bits.
Então, quando usar qual tipo?
Se os valores com os quais você trabalhará pode ser representado em 16 bits, então “está OK usar int
. Se precisar de mais de 16 bits, use long
. Se você precisar de mais de 32 bits, use long long
.
Não se preocupe com as especificações do compilador e / ou da CPU. Conforme mencionado por outros, mesmo dentro a mesma linha de produtos, Arduinos, existem CPUs de 16 e 32 bits disponíveis. Em vez disso, confie apenas no que o padrão garante.
As especificações completas dos tipos em C são:
-
char
deve ter pelo menos 8 bits -
int
deve ter pelo menos 16 bits -
long
deve ter pelo menos 32 bits -
long long
deve ter pelo menos 64 bits
Nota: É perfeitamente legal para compiladores implementar char, int, long e long long como 64 bits. Na verdade, isso não é incomum entre os DSPs.
Comentários
- Além disso: Leia a documentação do compilador
- E:
sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
de acordo com o padrão. Portanto, seint
tem 64 bits,long
também deve ter pelo menos 64 bits.
Resposta
É o mesmo raciocínio de C: o tamanho do tipo int
é esperado para ser o tamanho de palavra natural que seu sistema manipula com mais eficiência . Também deve ter pelo menos 16 bits de largura, não menor que short
e não maior do que long
.
Portanto, um int
pode ter 16, 32 ou 64 bits, com base no que seu sistema lida melhor e, portanto, é mais provável que tenha 16 bits de largura em uma CPU de 8 ou 16 bits, 32 em uma CPU de 32 bits etc.
Eu uso int
quando eu quero o melhor desempenho, enquanto tomo cuidado para me proteger quando preciso de mais alcance do que o oferecido pelos 16 bits. Atualmente, você tende a saber quando está escrevendo código de aplicativo para sistemas de 16 bits, embora isso não seja tão verdadeiro para o código de “biblioteca”, onde a portabilidade pode ser de maior preocupação.
Em seu exemplo, presumindo que o autor escolheu seus tipos com cuidado, as variáveis int
provavelmente requerem um pequeno intervalo e podem ser do tamanho de uma palavra , levando a um código potencialmente mais curto ou mais rápido (ou ambos). Os long
presumivelmente exigiam um intervalo de mais de 16 bits (eles têm a garantia de ter pelo menos 32 bits de largura). No processador que você “selecionou como destino de compilação, parece que int
e long
foram implementados como 32 bits; isso seria ser diferente (ou deveria ser) se você selecionou uma CPU de destino de 16 bits.
Resposta
Gosto de usar tipos de stdint.h
.
Embora tenham pequenas desvantagens, o benefício que oferecem é que você sabe exatamente o tamanho com que está lidando, mesmo ao compilar em outras arquiteturas.
#include <stdint.h> uint8_t my_byte = 0xf0; int16_t trig_pin = 2; int16_t echo_pin = 4; uint32_t duration, cm , blah; uint64_t big_int; // etc.
Mas, obviamente, você não quer mover um monte de int32_t quando seus dados só precisam de int16_t.
Comentários
- Portanto, não usar palavra de máquina o tamanho não afeta o desempenho do AVR?
- @Ren é – Geralmente, não usar o tamanho da palavra pode afetar o desempenho da maioria das CPUs. Mas, tradicionalmente, as CPUs AVR têm registros de 8 bits div id = “b7a8af7ac4”>
acumuladores com algumas instruções de 16 bits para operações de ponteiro. Então, quando eu programo, coloco o código em execução primeiro e, em seguida, otimizo para velocidade if it ‘ é muito lento.
word
como seu tipo de dados. São 16 bits no Arduino Uno e 32 bits no Arduino Due & Zero. Mas isso volta ao problema de realmente saber apenas o tamanho mínimo do seu tipo de dados. Digamos que você use word
em algum código devido, mas depois queira fazer a portabilidade para Uno ?! Em vez disso, usar uint32_t resolveria esse problema antes de começar, mas sim, o tamanho da palavra ficará abaixo do ideal no Uno. E quanto às futuras placas Arduino … que tamanho de palavra elas terão? 32? 64? 128 !? *fast*_t
parece ser o caminho a percorrer …