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
ilong
na 32-bitowych Arduino ARM, takich jak Due? - Myślę, że w Due,
int
ma 32 bity, to samolong
. 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śliint
ma 64 bity, tolong
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 koduword
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ą …