2012-01-27 18 views

Odpowiedz

15

Jest to sposób, aby zdefiniować niepodpisanych dosłownych całkowite stałe.

2

Oznacza to "unsigned int", zasadniczo działa jak rzutowanie, aby upewnić się, że stałe numeryczne są konwertowane na odpowiedni typ podczas kompilacji.

+0

To nie jest * konwertowane *, jest już typu 'unsigned int'. –

+1

Tak, ale * H2CO3 * powiedział "to * działa * jak gips", nie powiedział tego * jest * obsadą! –

+0

To znaczy, bez "u" byłby on podpisany, ponieważ jest to wartość domyślna dla stałych całkowitych. Tak więc, należy zwrócić uwagę na kompilator, aby uznać go za niepodpisany. Wiem, * że to nie jest obsada, to tylko próbka dla lepszego zrozumienia. –

2

Jest to sposób informowania kompilatora, że ​​stała 1 ma być używana jako liczba całkowita bez znaku. Niektóre kompilatory zakładają, że dowolna liczba bez sufiksu takiego jak "u" ma typ int. Aby uniknąć tego zamieszania, zaleca się użycie przyrostka takiego jak "u", gdy używana jest stała jako liczba całkowita bez znaku. Istnieją również inne podobne sufiksy. Na przykład dla float "f" jest używane.

+0

Nie "niektóre kompilatory". Wszystkie kompilatory. – Lundin

+0

Nie chciałem generalizować, ponieważ osobiście użyłem tylko kilku kompilatorów. – Mocha

+0

Chodzi mi o to, że standard C wymusza na kompilatorze traktowanie literału całkowitoliczbowego bez "u" jako podpisanego int. – Lundin

21

Liczby całkowite, takie jak 1 w kodzie C, są zawsze typu int. int to to samo, co signed int. Jeden dodaje u lub U (odpowiednik) do literału, aby upewnić się, że nie jest podpisany int, aby zapobiec różnym nieoczekiwanym błędom i dziwnym zachowaniom.

Przykładem takiego błędu:

Na komputerze 16-bitowym gdzie int jest 16 bitów, to wyrażenie będzie skutkować wartości ujemnej:

long x = 30000 + 30000; 

Obie 30000 literały są int i ponieważ oba operandy są int, wynik będzie int. 16-bitowa wartość int może zawierać tylko wartości do 32766, więc przepełni się. x otrzyma dziwną, ujemną wartość z tego powodu, zamiast 60000 zgodnie z oczekiwaniami.

Kod

long x = 30000u + 30000u; 

będzie jednak zachowują się zgodnie z oczekiwaniami.

+1

'to wyrażenie spowoduje wynik ujemny". Cóż lub demony wylecą z twojego nosa, ponieważ przepełnienie w liczbach całkowitych jest niezdefiniowanym zachowaniem. – ouah

+1

@ouah W teorii tak. W prawdziwym świecie wszystkie kompilatory, w jakich kiedykolwiek widziałem, obsługują przepełnienie typu integer w ten sam sposób. W każdym razie jest to błąd niezależnie od wyniku. – Lundin

+2

Fakt, że przepełnienie całkowite jest niezdefiniowane, jest nie tylko teoretyczny. Nawet w świecie rzeczywistym kompilatory wykorzystują przepełnienie liczb całkowitych jako niezdefiniowane zachowanie do wykonywania optymalizacji. 'gcc' na przykład ma co najmniej 20 przypadków, w których nie uwzględnia całkowitego przepełnienia do zawijania, więc może przeprowadzić optymalizację. Prostym przykładem jest wyrażenie takie jak 'a - 8 <42', jeśli' a' to podpisany typ 'gcc' może zredukować wyrażenie do' a <50'. – ouah