2013-04-01 10 views
22

, literały całkowite bez sufiksu typu są zawsze int s. Jednak zarówno gcc jak i klang interpretują 0xffffffff (lub dowolny literał, który jawnie ustawia bit znaku inny niż przy użyciu -) jako niepodpisany. Który jest poprawny? (Według this kompilatory są)Czy literalny 0xffffffff int lub unsigned w C++

+0

Nie wiem, ale chcę wiedzieć, dlaczego to ma znaczenie. –

+0

@roger_rowland nie, prawdopodobnie, ale clang ostrzega mnie przed konwersją z unsigned na signed, co jest denerwujące i którego nie zrozumiałem. – Walter

+0

Domyślam się, że punkt to 0xffffffff = 4294967295 to liczby dodatnie i nie mieszczą się w int. –

Odpowiedz

25

z pkt 2.14.2/2 C++ 11 standardu

Typ liczbę całkowitą dosłownym jest najpierw odpowiedniej listy w tabeli 6 którego wartość może być reprezentowana przez .

Tabela 6 raporty dla stałych szesnastkowym typu powinna wynosić:

  • int; lub (jeśli nie pasuje)
  • unsigned int; lub (jeśli nie pasuje)
  • long int; lub (jeśli nie pasuje)
  • unsigned long int; lub (jeśli nie pasuje)
  • long long int; lub
  • unsigned long long int.

Zakładając, że wdrożenie ma 32-bitowy int, ponieważ 0xffffffff nie pasuje w int, jego rodzaj powinien być unsigned int. W przypadku implementacji z 64-bitowym int typem będzie int.

Zauważ, że jeśli napisał to samo dosłowne jako dziesiętny stałe zamiast tego typu mogły być tylko:

  • int; lub (jeśli nie pasuje)
  • long int; lub (jeśli nie pasuje)
  • long long int.
+0

Interesujące. Czy mógłbyś powiązać ofertę z jej internetową stroną, jeśli to możliwe? – deepmax

+7

@MM .: To jest standard C++ 11 (używam wersji roboczej 3485, która jest nieco nowsza od oficjalnego standardu). Projekt można pobrać bezpłatnie [tutaj] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf). Oficjalny standard jest wypłacany. –

Powiązane problemy