2012-07-31 14 views

risposta

5

Questa è l'implementazione definita come le risposte precedenti già dicono.

Il mio gcc gestisce 'ab' come int. Il seguente codice:

printf("sizeof('ab') = %zu \n", sizeof('ab')); 
printf("'ab' = 0x%08x \n", 'ab'); 
printf("'abc' = 0x%08x \n", 'abc'); 

stampe:

sizeof('ab') = 4 
'ab' = 0x00006162 
'abc' = 0x00616263 

Nel codice, la riga:

char c = 'ab'; 

può essere considerato come:

char c = (char)(0x00006162 & 0xFF); 

Quindi c ottiene il valore dell'ultimo carattere di "ab". In questo caso è 'b' (0x62).

1

Poiché 'ab' ha tipo int e char può contenere solo un byte.

+0

Questo non risponde alla domanda, motivo per cui ottiene "b" piuttosto che "a", non perché ottiene "b" piuttosto che "ab". –

+0

@JimBalter la domanda è stata modificata e non ha avuto il * anziché 'a' * al momento in cui ho risposto. – ouah

+1

P.S. Poiché questa è una domanda in C, anche '' a'' e ''b'' hanno tipo' int'. –

5

Il valore di una costante intera multi-carattere è definito dall'implementazione, secondo C11 standard (§6.4.4.4 "Personaggio costanti" al10 P69):

10 - [...] Il valore di una costante di carattere intero contenente più di un carattere (ad esempio, 'ab') o contenente un carattere o sequenza di escape che non esegue il mapping di un carattere di esecuzione a byte singolo, è definito dall'implementazione. [...]

+0

Gli standard C90 e C99 hanno la stessa regola. –

10

Secondo lo standard, è l'implementazione definita. Da 6.4.4.4 Personaggio costanti di: costante carattere

Un numero intero ha tipo int. Il valore di una costante di carattere intero contenente un singolo carattere associato a un carattere di esecuzione a byte singolo è il valore numerico della rappresentazione del carattere mappato interpretato come un numero intero. Il valore di una costante di carattere intero contenente più di un carattere (ad es., 'ab') o contenente un carattere o sequenza di escape che non viene mappata su un carattere di esecuzione a byte singolo, è definito dall'implementazione.

+1

@ouah, come no? Sta affermando che sta all'implementazione il valore 'int' che assegna a un letterale a più caratteri. – hmjd

+0

@ouah Non importa quale sia il valore di una costante di un singolo carattere, 'b' è ancora rappresentato come 'b'. Questa risposta risponde alla domanda perché "b" piuttosto che "a" (cioè, dipende dall'implementazione), che la tua risposta non tocca nemmeno. –

+0

@JimBalter in realtà l'OP ha modificato la sua domanda per aggiungere il * piuttosto che 'a' * che IMHO modifica un po 'le intenzioni della domanda originale. – ouah

-1

In seguito modifica: la mia risposta era complementare a quelle precedenti che indicavano chiaramente che si tratta di un comportamento specifico dell'implementazione. Avevo l'impressione che l'OP volesse sapere, con questo in mente, perché il compilatore ha scelto "b" su "a". Scusa se la mia risposta è stata confusa.

Endianess. Ecco perché ottieni "b" anziché "a". A causa di come è rappresentato nella memoria della macchina. E la tua macchina è probabilmente little endian.

Provalo su uno sparc o su un mipsbe o su un braccio e potresti ottenere 'a' anziché 'b'.

In ogni caso, spero che non dipendiate da questo per il codice di produzione attuale.

+0

Non solo endianess. Anche l'ordine dei caratteri nel valore stesso non è definito. Diversi compilatori con gli stessi utenti usano una rappresentazione diversa (ad es. GCC vs Visual Studio). – Suma

+0

Infatti. Ma pensavo che fosse già stato risolto dalle risposte precedenti. Stavo solo cercando di chiarire il motivo per cui l'OP poteva ottenere "b's invece di" a nella sua prova. Il compilatore potrebbe scegliere il modo semplice di rappresentarlo e accedervi a seconda della piattaforma su cui è in esecuzione. –

Problemi correlati