1. Nie jestem w stanie zrozumieć kilku rzeczy. Po pierwsze, w jaki sposób dodanie liczby podpisanej i niepodpisanej rzutuje na wynik niepodpisany?
Jest to zdefiniowane przez liczby całkowite i stopień konwersji liczby całkowitej.
6.3.1.8 P1: W przeciwnym razie, jeżeli argument operacji, który ma unsigned liczby całkowitej oceniającym większa lub równa rangi typu drugiego argumentu operacji, a następnie operand z podpisanego typu całkowitego przeprowadza się w typ argumentu z unsigned typu integer.
W tym przypadku niepodpisany ma wyższą rangę niż int, dlatego int jest promowane do unsigned.
konwersja int (-2) na unsigned przeprowadza się zgodnie z:
6.3.1.3 P2 przeciwnym razie, jeżeli nowy typ jest podpisany wartość jest przekształcany przez wielokrotne dodanie lub odjęcie jednej więcej niż maksymalne wartości, które mogą być reprezentowane w nowym typie aż wartość mieści się w przedziale od nowego typu
2. Jeżeli wynik jest rzeczywiście 0xFFFFFFFF typu unsigned, dlaczego w systemie 32-bitowym , podczas dodawania go za pomocą ptr, będzie interpretowane ed jako ptr-1, biorąc pod uwagę, że liczba jest rzeczywiście typu bez znaku, a znak wiodący 1 nie powinien oznaczać znaku?
Jest to niezdefiniowane zachowanie i nie należy na nim polegać, ponieważ C nie definiuje przekroczenia arytmetycznego wskaźnika.
6.5.6 P8: Jeśli zarówno wskaźnik operandów a punkt wynik do elementów tego samego obiektu tablicy lub jeden za ostatnim elementu obiektu tablicy, ocena nie sporządza przelewu; w przeciwnym razie zachowanie jest niezdefiniowane.
3. Po drugie, dlaczego wynik jest inny w systemie 64-bitowym?
(Zakłada (podobnie jak rysunku), które są unsigned int 4 bajty).
Wynik A i B jest taki sam jak opisano w 1., to wynik jest dodawany do wskaźnik. Ponieważ wskaźnik ma 8 bajtów i zakładając, że dodawanie się nie przepełnia (może nadal, jeśli ptr ma duży adres, dający takie samo niezdefiniowane zachowanie jak w 2.) wynikiem jest adres.
Jest to niezdefiniowane zachowanie, ponieważ wskaźnik wskazuje drogę poza granicami tablicy.
kod pocztowy, a nie obraz z kodem. – chux
Zobacz http://stackoverflow.com/questions/24864103/replacing-arrays-access-variables- with-right-integer-type – technosaurus
Cieszę się, że ktoś zainteresowany moim artykułem. Na pytania już udzielono odpowiedzi. Trochę więcej szczegółów na temat arytmetyki adresu: http://www.viva64.com/en/l/0013/ I ogólnie wiele interesujących rzeczy na temat błędów 64-bitowych: http://www.viva64.com/ pl/l/full/ –