To forum używa plików cookies
To forum wykorzystuje pliki cookies do przechowywania informacji o Twoim logowaniu, jeśli jesteś zarejestrowany, oraz informacji o Twojej ostatniej wizycie, jeśli nie jesteś zalogowany. Pliki cookies to niewielkie pliki tekstowe zapisywane na Twoim komputerze; cookies ustawiane przez to forum mogą być używane wyłącznie na tej stronie i nie stanowią zagrożenia dla bezpieczeństwa. Cookies na tym forum śledzą również, które tematy zostały przez Ciebie przeczytane oraz kiedy miało to miejsce. Prosimy o potwierdzenie, czy akceptujesz, czy odrzucasz zapisywanie tych plików cookies.

Niezależnie od wyboru w Twojej przeglądarce zostanie zapisany plik cookie, aby zapobiec ponownemu zadawaniu tego pytania. W każdej chwili będziesz mógł zmienić ustawienia cookies, korzystając z linku w stopce strony.

Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Programowanie w języku C w środowisku AVR Studio4
Moim prywatnym zdaniem ... jeśli to niczemu nie przeszkadza ... wszystkie zmienne bym zrobił "unsigned long long", i wszystkie stałe też (przyrostek "ULL") ...

unsigned long long int FTW, fs, frequency;
fs=400000000ULL; // "ULL" -> "unsigned long long"
// ...
// poniżej ... przyrostek "ULL" w stałej wymusi przeprowadzenie
// obliczeń w precyzji "unsigned long long", nawet jeśli "frequency"
// i/lub "fs" będą tylko "unsigned long"
FTW = 4294967296ULL * frequency / fs;

Poza tym, żeby być pewnym kolejności wykonywania działań ... dodałbym nawiasy ...
albo ...
FTW = (4294967296ULL * frequency) / fs;
albo ...
FTW = 4294967296ULL * (frequency / fs);
zależnie od tego jak bym chciał żeby się to liczyło.

A propos, kompilator nie ma żadnego prawa zmienić typu ani rozmiaru zmiennej ... może co najwyżej wyemitować ostrzeżenie (warning) jeśli uzna że coś może być nie tak (ale być może jest o.k. bo tego właśnie chciał użytkownik), a w przypadku bardziej krytycznych problemów zgłosić błąd (error) i przerwać działanie ... zawsze to użytkownik musi sam poprawić swój kod źródłowy.

Na koniec jeszcze jedna uwaga ... upewnij się że twój kompilator naprawdę traktuje typ "long long" jako 8B (a "long" jako 4B). Co więcej, jego zachowanie może zależeć od konkretnych flag (opcji kompilatora) podanych w trakcie kompilacji kodu źródłowego.
Standard mówi jedynie że (zwróć uwagę na znak "mniejsze-równe"):
sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

Naprościej byłoby po prostu napisać kawałek testujący:

printf("%d %d %d %d\n", sizeof(short), sizeof(int), sizeof(long), sizeof(long long));
printf("%d %d %d %d\n", sizeof(unsigned short), sizeof(unsigned int), sizeof(unsigned long), sizeof(unsigned long long));

Generalnie jednak, użyłbym typów "Uint64_t" albo "u64" - to gwarantuje "unsigned 8-Bytes" (i "Uint32_t" albo "u32" dla zmiennych "unsigned 4-Bytes" oraz "Uint8_t" albo "u08" dla zmiennych "unsigned 1-Byte").
https://ccrma.stanford.edu/courses/250a/...yntax.html
https://ccrma.stanford.edu/wiki/AVR_Programming
Cytuj


Wiadomości w tym wątku

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości