Poniższy sposób standardowy (ISO 14882) opisano przerwania "1 sizeof (int)
operatora porównania`>”definiuje 5,9 (expr.rel/2)
zwykłe konwersje arytmetyczne wykonywane na argumentach arytmetyki lub typu wyliczenia. ...
zwykłej arytmetycznych konwersji jest określona w 5 (wyrażenie/9)
... Wzór nazywa się zwykle arytmetyczne konwersji, które są zdefiniowane w następujący sposób:
- Jeśli któryś z operandów jest typu double długo ...
- w przeciwnym razie, jeśli którykolwiek z operandów jest Dobule ...
- w przeciwnym razie, jeśli którykolwiek z operandów jest typu float, ...
- W przeciwnym razie całkowe awanse będą wykonywane na obu operandach.
- ...
Integralne promocji jest zdefiniowana w 4.5 (Conv.Bal/1)
rvalue typu znak, podpisany znak, unsigned char, krótkie int lub unsigned krótkim Int można przekształcić do rvalue typu int jeśli można Int oznaczają wszystkie wartości źródło typu ; w przeciwnym razie wartość rinue źródła może zostać przekonwertowana na wartość r type of unsigned int.
Wynikiem sizeof jest zdefiniowana w 5.3.3 (expr.sizeof/6)
Wynikiem tego jest stałe typu size_t
size_t jest zdefiniowany w standardzie C (ISO 9899), który jest liczbą całkowitą typu bez znaku.
Tak więc dla -1 > sizeof(int)
,> uruchamia zwykle konwersję arytmetyczną. Zwykła konwersja arytmetyczna konwertuje -1 na unsigned int, ponieważ int nie może reprezentować całej wartości size_t
. -1
staje się bardzo dużą liczbą w zależności od platformy. Tak więc -1 > sizeof(int)
jest true
.
To może być tylko literówka, ale 'size_t' to _an_ unsigned typ całkowity i nie musi to być przypadek, w którym' int' nie może reprezentować wszystkich wartości 'size_t' (' size_t' może być 'unsigned short '), chociaż oczywiście nie może na platformie pytającego pytającego. –
'(unsigned T) -1' nie jest tylko dużą wartością, jest * * największą wartością, jaką' unsigned T' może pomieścić. – GManNickG
Dobrze wiem, na co pozwala standard. :) -1 jest zawsze największa, przeczytaj zasady konwersji. Lub ten http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true/809341#809341 – GManNickG