In un'espressione C dove unsigned int int e firmato sono presenti, quale tipo sarà promosso a che tipo?

StackOverflow https://stackoverflow.com/questions/2280663

  •  21-09-2019
  •  | 
  •  

Domanda

Ho una domanda sulle regole di promozione dei tipi di dati in standard del linguaggio C. Il C99 dice che:

promozioni C interi richiedono anche che "se un int può rappresentare tutti i valori del tipo originale, il valore viene convertito in un int, altrimenti viene convertito in un unsigned int."

Le mie domande è in caso di un'espressione linguaggio C in cui sono presenti unsigned int e signed int, quale tipo sarà promosso a che tipo?

es. int non può rappresentare tutti i valori del unsigned int (valori superiori ai valori MAX_INT), mentre unsigned int non può rappresentare i valori -ve, in modo che tipo è promosso a quello che in questi casi?

È stato utile?

Soluzione

Credo che il seguente risponde alla tua domanda:

  

6.3.1.3 interi con e senza segno

     

1 Quando un valore di tipo intero viene   convertito in un altro tipo intero   diverso _Bool, se il valore può essere   rappresentata dal nuovo tipo, è   invariato.

     

2 In caso contrario, se la nuova   tipo è senza segno, il valore è   convertito ripetutamente aggiungendo o   sottraendo un più del massimo   valore che può essere rappresentato nel   nuovo tipo finché il valore è nella   gamma del nuovo tipo.

     

3 In caso contrario,   il nuovo tipo è firmato e il valore   non può essere rappresentato in essa; o   il risultato dipende dall'implementazione   o un segnale definito dall'implementazione è   sollevato.

Altri suggerimenti

Penso che si sta confondendo due cose. Promozione è il processo mediante il quale i valori di tipo intero "piccolo" che int / unsigned int sono convertiti sia per int o unsigned int. Le regole sono espressi un po 'strano (per lo più per il vantaggio di gestire in modo adeguato char), ma assicurano che il valore e segno sono conservati.

Poi v'è la differente concetto di usuale conversione aritmetica Con tale operandi di operatori aritmetici vengono convertiti in un tipo comune. Si comincia promuovendo l'operando (a uno int o senza segno) se sono di un tipo più piccolo di int e quindi la scelta di un tipo di destinazione dal seguente processo (per i tipi interi, 6.3.1.8/1)

  

Se entrambi gli operandi sono dello stesso tipo, allora non è necessaria alcuna ulteriore conversione.

     

In caso contrario, se entrambi gli operandi hanno firmato tipi interi o entrambi hanno firmato   tipi interi, l'operando con il tipo di minore intero rango conversione   convertito al tipo di operando con maggiore rango.

     

Altrimenti, se l'operando che ha senza segno tipo numero intero maggiore o rango   pari al rango di tipo dell'altro operando, quindi l'operando con   tipo intero segnato convertito al tipo dell'operando con unsigned   tipo intero.

     

In caso contrario, se il tipo di operando con il tipo intero con segno può rappresentare   tutti i valori del tipo dell'operando con tipo intero senza segno quindi   l'operando con tipo intero senza segno viene convertito nel tipo di   operando con il tipo intero con segno.

     

Altrimenti, entrambi gli operandi vengono convertiti nel tipo intero senza segno   corrispondente al tipo dell'operando con tipo intero firmata.

(Si noti che ISTR che queste regole sono cambiate leggermente tra C89 e C99)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top