Napisałem następujący kod c:C hex stały typ
#include <stdio.h>
int main() {
printf("%d\n", -1 >> 8);
return 0;
}
skompilować ten kod z gcc 4.6.3 na moim x86_64 używając -m32 flagę. Otrzymuję -1 wydrukowane, jak można by się spodziewać, przesunięcie następuje arytmetycznie za pomocą dwójki uzupełnień reprezentujących -1.
Teraz gdybym zamiast pisać
printf("%d\n", 0xFFFFFFFF >> 8);
uzyskać 16777215. Liczyłam tej stałej należy interpretować jako int (podpisany), a następnie przesunięcie się arytmetyka co skutkowałoby -1 ponownie. Przejrzałem najnowszy standard C i nie mogę zrozumieć, dlaczego tak się dzieje. Jakieś pomysły?
Jest to różnica między podpisane (-1) i bez znaku (0xFFFFFFFF) – SpacedMonkey
@SpacedMonkey pytam dlaczego 0xFFFFFFFF jest niepodpisany – dschatz
@SpacedMonkey Btw, '-' nie przyczynia się do tej różnicy. '-' jest nadal operatorem jednoargumentowym i nie powoduje podpisu. To jest '1', które jest podpisane (i dlatego też jest podpisane' -1'), podczas gdy '0xFFFFFFFF' jest unsigned. –