Językiem, którego używam jest C. Typ x i n to int.Różnica między ~ (x-1) i ~ x + 1, gdy x = 0x80000000
że jeden kod liniowy następująco
printf("x=%x,n=%d,first=%x,second=%x\n",x,n,((~(x+0xffffffff))>>n),((~x+1)>>n));
To pokazuje wartość X, n oraz dwie metody przeniesienia n bitów liczby dopełniacza x. Gdy x = 0x80000000, ~ (x + 0xffffffff) = 0x8000000, ~ x + 1 = 0x80000000, ale gdy przesunąć te dwa o n bitów, wyniki są różne.
btw, gdybym zmienił 0xffffffff do ~ 1 + 1 (czyli ~ (x + (~ 1 + 1)), wynik jest taki sam jak ~ X + 1
Zastanawiam się, dlaczego tak się stało. Dzięki .
[Czy "(uint16_t) -1" przenośny kod C?] (Http://embeddedgurus.com/barr-code/2011/06/is-uint16_t-1-portable-c-code/) – Lundin
@Lundin Ten artykuł jest błędny. '(uint16_t) -1' ** jest ** gwarantowane przez standard w celu utworzenia' 0xFFFF', jeśli implementacja dostarcza tego typu w 'stdint.h'. (Oczywiście, nic nie jest gwarantowane, jeśli jest to twój własny typedef.) Nie ma dwuznaczności, typy o stałej szerokości są wymagane, aby nie mieć bitów dopełniających, więc nie jest to nawet ograniczone do bitów wartości (dobrze, jest, ponieważ istnieje są tylko bitami wartości w 'uintN_t'). –