2012-03-15 10 views
5

Sono confuso su come la promozione del tipo si verifica in caso di printf e in generale. Ho provato il seguente codicepromozione di tipo printf e estensione di segno

unsigned char uc = 255 
signed char sc = -128 

printf("unsigned char value = %d \n", uc); 
printf("signed char value = %d \n", sc); 

Questo dà il seguente risultato:

unsigned char value = 255 
signed char value = -128 

Questo mi ha lasciato chiedendo su come la promozione ha effettivamente luogo e se un estensione del segno avviene o meno. Se viene eseguita un'estensione del segno, il valore 255 deve essere stampato come valore negativo (-128 rimane lo stesso) e se non viene eseguita alcuna estensione del segno, allora -128 deve essere stato stampato come valore positivo (255 rimane lo stesso). Spiega per favore.

risposta

4

Se un estensione del segno è fatto allora il valore 255 deve essere stampato come valore negativo

È qui che ti sbagli - tutti i valori di tipo unsigned char tra cui 255, possono essere rappresentati in un int , quindi la promozione a int da unsigned char avviene senza attività divertenti.

In caso di problemi si verifica quando un valore firmato deve essere convertito (che è una cosa diversa dalla promozione e si verifica per creare un tipo comune per gli operandi) su un valore senza segno. Se quel tipo firmato ha un valore negativo, la conversione in un tipo senza segno cambierà il valore.

In sintesi, la promozione intera conserva il valore (incluso il segno), la conversione può modificare il valore.

2

L'estensione del segno è stata completata. Ma non è possibile firmare estendere un unsigned char perché non ha bit di segno. L'intero punto di estensione del segno è di mantenere il valore lo stesso. Oppure, se preferisci pensarlo in questo modo, ogni variabile senza segno ha un bit di segno di zero implicito. Pertanto, quando il segno è esteso a un tipo di firma più grande, il bit del segno dovrebbe essere zero nel tipo più grande.

0

L'estensione del segno è stata completata.

Ma dal momento che il caso di uc, non c'è alcun segno, in quanto è un unsigned char, quindi è lasciato positivo.

1

Entrambi sono promossi a ints - quindi mantenendo il segno.

4

Una funzione va_arg non ha informazioni sul tipo previsto per la parte .... Pertanto si applicano le regole di promozione per le funzioni dichiarate senza prototipo. Ciò significa che tutti i tipi più brevi di int vengono promossi a int o unsigned direttamente. Quindi la tua funzione printf non vede mai un (un)signed char.

Problemi correlati