Jeśli jeden negwords[j].length()
lub comments[i].length()
zwracają nieoznaczoną integralną typ co najmniej tak duży jak unsigned int
, następnie k
będą promowane do tego samego typu unsigned i zasady będą miały zastosowanie oprócz modułowego.
Jako przykład oznacza to, że 1 < 2 - 3
jest prawdziwe, ponieważ 2 - 3
owija się w arytmetykę modułową, stając się bardzo dużą liczbą.
Jeśli jesteś zainteresowany, to zachowanie jest określone w sekcji 3.9.1 niniejszego standardu, który obejmuje zasadę:
liczb całkowitych bez znaku powinien stosować się do prawa arytmetyki modulo 2 n gdzie n to liczba bitów w reprezentacji wartości tego konkretnego rozmiaru liczby całkowitej.
I przypis dotyczące wpływu:
Oznacza to, że bez znaku arytmetyczna nie przeleje ponieważ wynik, który nie może być reprezentowane przez otrzymanej unsigned całkowitej redukuje modulo dla numeru jedna większa od największej wartości, która może być reprezentowana przez wynikowy typ liczby całkowitej bez znaku.
Matematycy wiedzieć tego typu arytmetyczną
algebry pól Galois
. W C++ jest on używany do niepodpisanych typów integralnych. Inne typy nie używają arytmetyki modułowej, ale nie używają też zwykłej arytmetyki klasy szkolnej (formalnie, algebry liczb rzeczywistych), ponieważ normalna arytmetyczna wymaga gęstego nieprzeliczalnego zestawu liczb, a komputera skończonego rozmiar nie może reprezentować członków nieskończonego zbioru.
Podziękowania dla Olivera za wskazanie mojego błędu. GF (2)^n reguluje operacje bitowe i wiele innych typowych obliczeń wykonywanych w oprogramowaniu komputerowym, takim jak CRC. Ale nie opisuje on niepodpisanej arytmetyki o wartości większej niż 1 bit, ponieważ wielomiany na polach Galois nie "przenoszą się".
Czy 'length()' zwraca niepodpisany typ? –
nie powinien być k + komentarzem [i] .length() – cyan
@cyan: Nie, jeśli odejmiesz 'negwords [i] .length()' od obu stron warunku pierwszej pętli, otrzymasz drugi. –