2016-11-18 17 views
5

Widziałem to z C Primer Plus, 6. edycji, przegląd pytań w rozdziale 3.Dlaczego 0XAA jest niepodpisaną int, a nie int?

Pytanie:

Question Picture

odpowiedzi w Dodatku A:

Answer Picture

Uwaga d.0XAA, moja odpowiedź to stała int, format szesnastkowy, Ale odpowiedź jest unsigned int

i zastanawiam się dlaczego

+0

Tak definiuje język. Ktoś w pewnym momencie zdecydował, że tak powinno być. Naprawdę nie możesz dowiedzieć się dlaczego, chyba że masz maszynę czasu i możesz zapytać, kto podjął tę decyzję kilka dekad temu. – Art

+0

@Art możesz podać więcej informacji ze standardu C lub czegoś innego? Doceniam to :) –

+0

Oto referencja, której potrzebujesz http://stackoverflow.com/questions/12499592/c-hex-constant-type – HighPredator

Odpowiedz

5

Ta książka jest nieprawidłowy. Zgodnie C11 6.4.4.1, typ stałych całkowitych w systemie szesnastkowym są określane na podstawie tej tabeli:

Suffix ... Octal or Hexadecimal Constant 

None  ... int 
       unsigned int 
       long int 
       unsigned long int 
       long long int 
       unsigned long long int 

u or U ... unsigned int 
       unsigned long int 
       unsigned long long int 

stałej 0xAA ma przyrostek więc górna część powyższej tabeli jest to, co odnosi. Znaczenie: kompilator najpierw sprawdzi, czy wartość może zmieścić się w int. Jeśli nie pasuje, sprawdzi, czy pasuje do unsigned int i tak dalej.

Przy każdej znanej implementacji C wartość 0xAA z pewnością zmieści się wewnątrz int. Prawidłowa odpowiedź na to pytanie to int.

Jednakże, gdyby stała była 0xAAu, dolna część cytowanej tabeli zostałaby zastosowana, a wynikiem byłby unsigned int.

+3

Aby dodać do odpowiedzi, ponieważ standard wymaga, że ​​'INT_MAX' ma co najmniej' + 32767', wszystkie stałe szesnastkowe bez sufiksu od '0x0' do' 0x7fff' są zawsze 'int'. – user694733

+0

To nie było wymienione wśród znanych błędów, więc wysłałem erratę do wydawcy. – Lundin

+0

Dziękuję za odpowiedź szczerze^_ ^ –

Powiązane problemy