Różnica między typem danych int i long na Arduino

Uczyłem się programować dla robota z przeszkodami void , ale kiedy spojrzałem na kod Widziałem dwa typy danych long i int.

Int to typy danych zawierające od -2 147 483 648 do 2 147 483 647. Długie są również typy danych, które mieszczą od -2,147,483,648 do 2,147,483,647.

Int i long są takie same, ale wymyśliłem kod, w którym używane są dwa typy danych, jak pokazano poniżej:

int trigPin = 2; int echoPin = 4; long duration, cm, inches; 

Ale skąd możesz wiedzieć, kiedy użyć jakiego typu danych? Szukałem dużo w internecie, ale nie rozumiałem, więc czy ktoś może mi to wyjaśnić.

Komentarze

  • " Int to typy danych zawierające od -2 147 483 648 do 2 147 483 647 " Gdzie to słyszałeś?

Odpowiedź

W Arduino (modele AVR) int ma 16 bitów, a nie 32 bity. W ten sposób zmienia się z -32768 na +32767.

To znaczy inny od long czyli 32 bity.

Komentarze

  • Jakie są szerokości int i long na 32-bitowych Arduino ARM, takich jak Due?
  • Myślę, że w Due, int ma 32 bity, to samo long. Zobacz na przykład tutaj .

Odpowiedź

int w AVR GCC to 16 bity , nie 32.

Odpowiedź

Zgodnie ze specyfikacją języka C , int musi mieć co najmniej 16 bitów lub więcej, a long musi mieć co najmniej 32 bity lub więcej.

Kompilator może zaimplementować int jako 32 lub nawet 64 bity. Kompilator może zaimplementować long jako 64-bitowy lub dłuższy. Jednak kompilator nie może zaimplementować long jako 16 bitów.

Kiedy więc użyć jakiego typu?

Jeśli wartości , z którym będziesz pracować, może być reprezentowane w 16 bitach, wtedy możesz użyć int. Jeśli potrzebujesz więcej niż 16 bitów, użyj long. Jeśli potrzebujesz więcej niż 32 bity, użyj long long.

Nie daj się wciągnąć w specyfikę kompilatora i / lub procesora. Jak wspominali inni, nawet w z tej samej gamy produktów, Arduino, dostępne są procesory 16- i 32-bitowe. Zamiast tego ufaj tylko temu, co gwarantuje standard.

Pełna specyfikacja typów w języku C to:

  • char musi mieć co najmniej 8 bitów
  • int musi mieć co najmniej 16 bitów
  • long musi mieć co najmniej 32 bity
  • long long musi mieć co najmniej 64 bity

Uwaga: kompilatory mogą implementować char, int, long i long long jako 64 bity. W rzeczywistości nie jest to rzadkie wśród platform DSP.

Komentarze

  • Ponadto: przeczytaj dokumentację swojego kompilatora
  • Oraz: sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long) zgodnie ze standardem. Tak więc, jeśli int ma 64 bity, to long również musi mieć co najmniej 64 bity.

Odpowiedź

To samo rozumowanie co w C: oczekiwany jest rozmiar typu int aby był naturalnym rozmiarem słowa, który Twój system obsługuje najskuteczniej . Musi też mieć co najmniej 16 bitów szerokości, nie mniejszy niż short i nie większy niż long.

Zatem int może mieć 16-, 32- lub 64-bitowe na tym, co twój system radzi sobie najlepiej, więc najprawdopodobniej będzie to 16 bitów na 8- lub 16-bitowym CPU, 32 na 32-bitowym CPU itd.

Używam , gdy chcę uzyskać najlepszą wydajność, jednocześnie uważając, gdy potrzebuję większego zasięgu niż oferowany przez 16-bitowy. Obecnie zwykle wiesz, kiedy piszesz kod aplikacji dla systemów 16-bitowych, chociaż „nie jest to prawdą w przypadku kodu” bibliotecznego „, w którym może być ograniczona przenośność większą troskę.

W twoim przykładzie, zakładając, że autor starannie wybrał ich typy, zmienne int prawdopodobnie wymagają małego zakresu i mogłyby pozwolić sobie na to , co prowadzi do potencjalnie krótszego lub szybszego kodu (lub obu). Te long przypuszczalnie wymagały zakresu ponad 16-bitowego (gwarantowane są co najmniej 32 bity szerokości). Na procesorze, który wybrałeś jako cel kompilacji, wygląda na to, że int i long zostały zaimplementowane jako 32-bitowe. być inny (lub powinien być), jeśli wybrałeś 16-bitowy docelowy procesor.

Odpowiedź

Lubię używać typów z stdint.h.

Chociaż mają drobne wady, ich zaletą jest to, że wiesz dokładnie, jaki rozmiar obsługujesz, nawet podczas kompilacji na innych architekturach.

#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. 

Ale oczywiście nie chcesz poruszać się po zbiorze int32_t, gdy twoje dane potrzebują tylko int16_t.

Komentarze

  • Więc nie używaj słowa maszynowego rozmiar nie wpływa na wydajność na AVR?
  • @Ren é – Generalnie brak rozmiaru słowa może wpłynąć na wydajność większości procesorów. Ale tradycyjnie procesory AVR mają 8-bitowe rejestry & akumulatory z 16-bitowymi instrukcjami dla operacji wskaźnikowych. Kiedy więc programuję, najpierw uruchamiam kod, a następnie optymalizuję pod kątem szybkości jeśli to jest zbyt wolno.
  • @Ren é – ale jeśli naprawdę chcesz być pedantyczny, możesz użyć word jako typ danych. To jest 16 bitów w Arduino Uno i 32 bity w Arduino Due & Zero. Ale to wraca do problemu znajomości tylko minimalnego rozmiaru typu danych. Powiedzmy, że używasz kodu word na jakimś kodzie Due, ale potem chcesz przenieść z powrotem do Uno ?! Użycie uint32_t zamiast tego rozwiązałoby ten problem przed rozpoczęciem, ale tak, rozmiar słowa będzie nieoptymalny na Uno. A co z przyszłymi płytami Arduino … jaki rozmiar słowa będą miały? 32? 64? 128 !?
  • OK. Więc użyłbym rozmiaru słowa maszynowego (int? WORD wydaje się być przestarzałą definicją typu Windows), jeśli dolny limit jest wystarczający, nie obchodzi mnie rozmiar pamięci i potrzebuję szybkości, * _t jeśli zależy mi na rozmiarze?
  • notka, która … gnu.org/software/libc/manual/html_node/Integers.html zawiera tekst *fast*_t wydaje się być właściwą drogą …

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *