2012-12-30 34 views
5

Come mai è possibile assegnare un indirizzo a una variabile intera come questa, il compilatore non darà un errore. Ho sempre se è possibile assegnare solo valori interi a una variabile interaAssegnazione dell'indirizzo alla variabile intera

int a=0x28ff1c 

Si può fare lo stesso per una variabile char, il compilatore non darà un errore di

char b=0x28ff1c 

Sarà uscita sulla console il valore dei rifiuti schermo per char B e un valore casuale per int a

cout<<b 
    <<endl; 
cout<<a; 

qualcuno può spiegarmi perché c'è una differenza nell'output per char b, int a. Qualcuno può anche spiegarmi perché una variabile char e una variabile intera possono avere indirizzi assegnatigli

+3

'0x28ff1c' _is_ un valore intero. – Mat

risposta

5

Il numero 0x28ff1c è solo la rappresentazione esadecimale (base-16) del numero decimale (base 10) 2686748. Poiché cout imposta automaticamente i valori decimali per i numeri interi, questo è probabilmente il numero che hai stampato.

il caso con char b = 0x28ff1c è leggermente diverso, perché

  1. char non è abbastanza grande da contenere tale valore. Il risultato pratico è che viene troncato a 0x1c.
  2. cout tratta char in particolare, perché è normalmente utilizzato per contenere dati testuali, quindi cout stampa il carattere che ha il codice 0x1c, che è una sorta di carattere di controllo. Si può provare con 0x41 per esempio (che rappresenta 'A' in ASCII e UTF-8).

E notare che non c'è nulla che contrassegni 0x28ff1c come un indirizzo. Un indirizzo sarà formato da &a o (void*)0x28ff1c.

+0

grazie grazie grazie – Computernerd

+0

'(char *) 0x28ff1c' è più sicuro (a meno che non si può garantire' 0x28ff1c' è allineata correttamente per 'int') - cc. Domanda bonus @Lim: il risultato è troncato o è un comportamento non definito a causa dell'overflow (tenere conto che 'char' è firmato)? –

+0

@LuchianGrigore Implementazione-definita (a meno che non sia 'CHAR_BIT> = 23'), potrebbe saturare, troncare, mappare tutti i valori fuori range a 13, l'implementazione deve solo documentare cosa fa. In C, potrebbe persino generare un segnale definito dall'implementazione. –

8

0x28ff1c non è un indirizzo in sé, è solo un numero esadecimale.

I seguenti sono equivalenti:

int a = 2686748; //decimal number 
int a = 0x28ff1c; //hexadecimal number 
int a = 012177434; //octal number 

Un indirizzo è rappresentato da un puntatore - se è solo che, un indirizzo, è possibile utilizzare un void*:

void* p = (void*)0x28ff1c; 

Nel qual caso

int a = p; 

non verrà compilato. p è un indirizzo, il numero stesso non lo è.

+0

@Luchin come si spiega la differenza di output di int a e char b e come mai il compilatore non fornisce un errore quando si assegna un valore intero a char b – Computernerd

+0

@Lim un char è solo 1 byte, quindi non può contenere l'intero valore. Un avvertimento * può * essere rilasciato, ma non è obbligatorio. Stai praticamente traboccando la variabile 'char' (quindi stampa un risultato errato). –

+0

@ Luchin grazie – Computernerd

1

Perché in ogni letterale 0x iniziale è in realtà un numero intero. Quindi è permesso. Un indirizzo è a volte può essere un numero intero.

+0

Gli indirizzi non sono interi. In molte implementazioni, potrebbe essere possibile convertire gli indirizzi in numeri interi senza problemi. In alcune implementazioni, gli indirizzi possono avere una struttura che non è ben rappresentata in un singolo numero intero (ad esempio, l'aggiunta di 1 alla codifica di un indirizzo potrebbe non produrre un indirizzo che è di 1 byte ulteriormente in memoria). –

+0

Buon punto @EricPostpischil. Dirò "A volte un indirizzo può essere un numero intero" –

+0

@EricPostpischil Non vedo come sia rilevante. Certo, un 'int' non è garantito per contenere un indirizzo, ma l'aritmetica del puntatore non è in discussione qui. Quello che hai indicato (aggiungendo a un indirizzo) è molto più complicato di quello (può persino portare a UB). –

0

È inoltre possibile utilizzare *(int *)(Address) = value come un costrutto per assigne un value per Address e utilizzare la risposta @Luchian Grigore

Problemi correlati