Wpis z mikrobloga

#programowanie #avr #mikrokontrolery
Mirko pomóż, bo już nie ogarniam...
Mam zmienną memorysize, próbowałem użyć typów unsigned long i uint32t (powinny być tożsame) - w obu przypadkach jest to samo.
W momencie kiedy ustawiam wartość w ten sposób:
memorysize = 1<<addrbuswidth; //(gdzie addrbuswidth = 15)
porównanie memory
size z inną zmienną tego samego typu zwraca 0 nawet jeśli wartości są takie same. Natomiast ustawienie wartości w ten sposób:
memory_size = 32768UL;
sprawia, że porównanie działa.
Zastanawia mnie to, że w obu przypadkach zmienne mają dokładnie tą samą zawartość (wysłałem po serialu) - 0x00008000

Używam avr-gcc 5.4.0, próbowałem wyłączać optymalizację - nie ma różnicy.
Debuggera niestety nie mam ( ͡° ʖ̯ ͡°)
Edit: mirko coś psuje podkreślenia - w kodzie nazwy zmiennych się zgadzają
  • 19
@6502: ale literał jest typu int (1). W C i C++ niestety tak to działa. Typ zmiennej nie ma tu znaczenia, bo obliczenia będą takie same niezależnie co napiszesz po lewej stronie
@6502: Widzę, że już ci napisali o co cho - literał 1 jest intem (ze znakiem). Dla platformy, na którą kompilujesz, GCC uznał, że int będzie 16-bitowy. Maksymalna wartość dla 16-bitowego inta ze znakiem to 32767 (2^15-1). Wynikiem działania 1<<15 jest zatem overflow inta ze znakiem, co w C jest undefined behavior (co ciekawe overflow unsigned inta jest ściśle zdefiniowany przez standard). W świetle standardu C taki program może więc zrobić