krawi92 napisał(a):
Co muszę doczytać, żeby to zrozumieć?
O reprezentacji liczb ujemnych a więc o tzw. kodzie uzupełnień do dwóch.
1. Wyrażenie (1<<7) to binarnie 0b0000000010000000, dziesiętnie 128.
2. Po zaaplikowaniu negacji bitowej 0b1111111101111111 dziesiętnie -129.
3. Po obcięciu starszego bajta: 01111111 dziesiętnie 127.
Obcięcie spowodowało utratę bitu znaku - kompilator emituje ostrzeżenie.
1. Wyrażenie (1<<6) to binarnie 0b0000000001000000 dziesiętnie 64
2. Po negacji bitowej 1111111110111111 dziesiętnie -65
3. Po obcięciu starszego bajta 0b10111111, dziesiętnie -65
Nie nastąpiła utrata znaku - brak ostrzeżenia.
Domyślnie stałe takie jak 1 są interpretowane jako int a więc jako liczba ze znakiem. Można wymusić by stała była traktowana jako liczba bez znaku, i uniknąć nieprzyjemności związanych z bitem znaku, dopisując do stałej u lub U czyli np. 1U. A więc w Twoim przypadku pozbędziesz się ostrzeżenia definiując segment jako
#define SEG_DP (1U<<7)
_________________
Think for yourself and question authority
.