2014-11-21 16 views
5

Dlaczego 1 nie jest większy niż -0x80000000. Wiem, że ma to coś wspólnego z przepełnieniem. Ale czy ktoś może wyjaśnić dlaczego? czy 0x80000000 nie jest stałą, jak sądzę?Dlaczego 1 nie jest większy niż -0x80000000

assert(1 > -0x80000000); 

Aktor uruchamia się w C++. Dlaczego?


Jestem wdzięczny za udzieloną odpowiedź. Ale czy standard C++ definiuje, że stała musi być przechowywana w 32-bitowej liczbie całkowitej? Dlaczego kompilator nie rozpoznał, że 80000000 nie pasuje do 32-bitowej liczby całkowitej i używa do tego 64-bitowego? Mam na myśli, że największym 32-bitowym int może być 0x7FFFFFFF. 0x80000000 jest oczywiście większy. Dlaczego kompilator nadal używa do tego 32 bitów?

+12

Jaką wartość uważasz "-0x80000000" w rzeczywistości? –

+4

Pachnie jak zadanie domowe. –

+0

Ponieważ twoje 'unsigned's mają 32-bitowe wartości. – Deduplicator

Odpowiedz

11

Zgodnie ze standardami C i C++ -0x80000000 nie jest stałą całkowitą. To wyrażenie, takie jak 3 + 5. W tym przypadku jest to stała 0x80000000, obsługiwana przez operatora negacji. W przypadku kompilatorów z 32-bitowymi int s, 0x80000000 nie można przedstawić jako int, ale można go reprezentować jako unsigned int. Ale zanegowanie niepodpisanej liczby całkowitej jest (dziwacznie) zrobione w niepodpisanym kontekście. Tak więc negacja skutecznie nie ma żadnego skutku.

+0

Dlaczego jest konwertowany na "unsigned int"? – vsoftco

+0

Potem nie rozumiem. Na moim komputerze 'int' ma 64 bity, więc wystarczająca ilość miejsca do reprezentowania' -0x80000000'. W jaki sposób interpretowane jest to wyrażenie? Tj. Do jakiego typu jest promowany? Jeśli rzuciłem go na '(int)', to jest w porządku, wyświetla jako '-2147483648', wartość, którą reprezentuje. – vsoftco

+1

@vsoftco Nawet jeśli twój procesor jest 64-bitowy, jest bardzo mało prawdopodobne, że twój kompilator ma 64-bitowe 'int's. – Sneftel

0

Jednym sposobem rozwiązania tego problemu jest użycie typu, że wiesz, że jest prawdopodobne, aby być w stanie reprezentować i zachowują swoją wartość prawidłowo, co oznacza, że ​​wyrażenie może być ustalone jak tak

assert(1 > -0x80000000L); 

lub

assert(1 > -0x80000000LL); 

który jest w zasadzie o użyciu standardowego przyrostek w C++ dla rzekomo całkowitej wypowiedzi.

jedynie trzy standardowe sufiks typów całkowitych C++ są u, l i ll wraz z wielkich odmian, które oznaczają to samo, co ich odpowiedniki małymi; U, L i LL.

Powiązane problemy