2015-06-06 6 views
8

Voglio sapere che quando modifichiamo l'int per raddoppiare, il risultato effettivo in cui è memorizzato int viene modificato o aumentato? perché int è di 4 byte (assumiamo) e quando otteniamo typecast per raddoppiare che è di 8 byte (assunto), allora la dimensione aumenta anche ora per memorizzare il valore di double? E per favore andate piano con me se è una domanda stupida?Quando modifichiamo l'int per raddoppiare, l'indirizzo effettivo in cui è memorizzato int viene modificato?

risposta

5

La trasmissione non influisce sulla variabile e sulla memoria corrispondente. È giusto e indica al compilatore come interpretare i bit che risiedono nel luogo specificato.

In Marcus'es esempio:

int i = 12; 
double d = (double)i; 

d è una nuova variabile in una nuova posizione. Il valore originale, i, non è interessato. Tuttavia, se si inizia a giocare con i puntatori poi bisogna stare attenti:

int i = 12; 
double *p = &i; 

Ora, se double è di 8 byte vasta poi notare che utilizzando p si/compilatore per scontato che punta a una posizione di memoria che ha 8 byte di memoria allocati per la variabile a cui punta. Questo tuttavia non è vero, perché in realtà punta a i, che ha una larghezza di soli 4 byte (supponiamo che lo int sia largo 4 byte).

EDIT

Questa è una (relativamente) recente modifica motivata dal PO richiesta di chiarimenti nei commenti. Il PO vuole sapere:

cosa succede al l'indirizzo di memoria di somma quando ottiene typecast fa valore ora typecasted della somma memorizzati da qualche altra parte nella memoria

ed ecco il codice:

int sum = 17, count = 5; 
double mean; 
mean = (double) sum/count; 

C'è in realtà un bel po 'nelle tre righe di codice di cui sopra. Tuttavia, la cosa importante qui è che la variabile sum non viene affatto modificata. Viene usato solo come argomento in aggiunta. Per aggiungere due variabili, sono necessari solo i valori corrispondenti. Prima di aggiungere, il compilatore molto probabilmente copierà le due variabili in registri. Poiché si esegue il cast di un double, il compilatore molto probabilmente memorizzerà il valore di sum in un registro a 64 bit di larghezza (supponiamo che il doppio sia a 64 bit di larghezza) e il gioco è fatto. Tuttavia, tieni presente che questa è specifica dell'implementazione e varierà da un compilatore all'altro. Non è qualcosa che è specificato dallo standard C.

A questo punto, se vuoi capire di più, è meglio compilarlo in Assembly e cercare di capirlo. Spero che questo ti aiuti!

+0

ma non capisco da dove viene quella memoria extra che viene utilizzata per memorizzare il risultato typecast come se dovessimo digitare typecast int in raddoppiare potrebbe essere necessario più bit di int. –

+0

@PrinceVijayPratap In molti casi pratici è gestito internamente dal compilatore. Sarebbe più facile se punti a una linea di codice confusa. –

+0

Sarà assegnato alla memoria dinamica del tempo di esecuzione o sarà preassegnato dal compilatore, se è possibile dedurre che avrà comunque bisogno di quella memoria. –

0

Voglio sapere che quando si preme il comando int per raddoppiare, il risultato effettivo in cui è memorizzato int viene modificato o aumentato?

Poiché int e double in C sono due tipi distinti, sì, il casting di un int a un double non può avvenire nello stesso punto in cui era int - anche se questi due tipi avevano la stessa dimensione.

Facciamo un esempio: se fusione sovrascritto la variabile originale, quali sarebbero gli effetti di

int i = 12; 
double d = (double)i; 
int i2; 
i2 = i + i; 

essere?

EDIT: @Dani aggiunto che

La doppia possono occupare lo stesso indirizzo se l'int non è più utilizzato.

Sì, i compilatori possono controllare se una variabile sarà/potrebbe essere accessibile in un secondo momento e può effettuare operazioni sul posto se ciò aiuta; tuttavia, che non è il caso qui:

  1. in generale, è necessario assumere l'indirizzo sarà diverso
  2. in questo caso, i tipi non hanno nemmeno la stessa dimensione
  3. nel mio esempio, i è accesso in seguito, e
  4. in realtà, non è probabile che sia una buona idea - a seconda di cosa sta per accadere al doppio dopo aver lanciato su una CPU moderna è che molto probabilmente sarà scritto in un registro speciale dedicato a elaborazione in virgola mobile, che non sarà quella in cui era lo int.
+0

perché i downvotes? Ho la stessa risposta di banach-space; quella risposta mi cita anche! –

+1

Il doppio può occupare lo stesso indirizzo se l'int non è più utilizzato. – Dani

+0

@Dani, che è un caso speciale che può applicarsi solo se l'intero è in realtà non è più utilizzato (sì, i compilatori sono intelligenti e possono notare che), e ancora più importante qui, se i vincoli di dimensione permettono. Per tutte le macchine che vorrei sapere, non è il caso di 'double' e' int'. –

0

quando abbiamo convertito il numero int in double il risultato effettivo in cui è memorizzato int viene modificato o aumentato?

No, il cast di tipo è solo un modo per convertire una variabile da un tipo di dati a un altro tipo di dati.

quando facciamo

int i = 10; 
double d = (double)i; 

in realtà, stiamo facendo la arithmetic promotion. Poiché double è di 8 Byte e int è di 4 Byte. Quindi, non ci sarebbe alcuna perdita. Ma viceversa non è vero.

Le conversioni di tipo possono essere implicite eseguite automaticamente dal compilatore oppure possono essere specificate esplicitamente mediante l'utilizzo dell'operatore di trasmissione.

La conversione aritmetica usuale viene eseguita utilizzando la seguente gerarchia.

Usual Arithmetic Conversion

2

Questa è la stessa domanda come "in a = b + c * d; dove è il risultato intermedio di c * d memorizzato?".

Risposta semplice: in una variabile temporanea gestita dal compilatore. Molto probabilmente sarà un registro. Lo standard di lingua non definisce questo - perché dovrebbe effettivamente?

Il typecast è in realtà simile a -b (b negato). Questo dovrebbe anche essere memorizzato da qualche parte prima di essere utilizzato.

Si noti che il valore originale non viene modificato e la variabile che riceve deve essere del tipo corretto in ogni caso (che è uno dei motivi per cui non è possibile typecast la variabile di ricezione).

La conversione da doppia a virgola mobile viene eseguita implicitamente dal compilatore, quindi non è necessario un cast esplicito e non dovrebbe essere utilizzata in tali casi, in quanto nasconderà il problema che potrebbe sorgere in seguito a modifiche dei tipi .

0

Il risultato del cast non potrebbe avere memorizzato da nessuna parte; infatti, potrebbe non essere mai calcolato affatto!

Se ho un frammento di programma

int i = 42; 
double j; 
j = 1.0 + (double) i; 

il programma ha solo comportarsi come se la conversione è successo e quindi il risultato è stato aggiunto al 1.0, ma a condizione che il risultato finale è corretta, il il programma è autorizzato a produrre quel risultato in qualsiasi modo voglia; non è nemmeno necessario che assomigli al codice il codice che hai scritto.

ad es. su una macchina con un'istruzione "aggiungi numero intero in virgola mobile", il compilatore può scegliere di fornire un programma che utilizza tale istruzione, piuttosto che eseguire una conversione seguita da un'aggiunta.