Diferença entre o tipo de dados int e long no Arduino

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 e long nos Arduinos ARM de 32 bits, como Devido?
  • Acho que no Devido um int tem 32 bits, o mesmo que long. 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, se int 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.

  • @Ren é – Mas se você realmente quiser ser pedante sobre isso, pode usar 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 !?
  • OK. Portanto, eu usaria o tamanho da palavra de máquina (int? WORD parece ser uma definição de tipo de janela obsoleta) se o limite inferior for suficiente, não me importo com o tamanho da memória e preciso da velocidade, * _t se me importo com o tamanho?
  • recado que … gnu.org/software/libc/manual/html_node/Integers.html diz *fast*_t parece ser o caminho a percorrer …
  • Deixe uma resposta

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *