2016-04-26 48 views
-1

因此,這裏是我的代碼當我使用int或double時,爲什麼在c中獲得兩個不同的輸出?

double blocksize = 32; 
    double indexSize, tagSize, offsetSize; 

int main(int argc, char** argv) { 
    double index; 
    double cachesize = 1; 

    offsetSize = log(blocksize)/log(2.0); 
    index = cachesize/blocksize * 1024; 
    indexSize = (log(index)/log(2.0)); 
    tagSize = 32 - indexSize - offsetSize; 


    printf("Offset : %f\n", offsetSize); 
    printf("Index: %f\n", index); 
    printf("Index : %f\n", indexSize); 
    printf("Tag : %f\n", tagSize); 

    return (EXIT_SUCCESS); 
} 

所以問題是,當我給你的一切爲int,我得到這樣的輸出:

偏移:5

指數:0

指數:-2147483648

標籤:-2147483621

然而,當我給你的一切,雙我得到這樣的輸出:

偏移:5.000000

指數:32.000000

指數:5.000000

標籤:22.000000

爲什麼我我得到兩個不同的輸出?我認爲double和int唯一的區別是int是整數,但double不是整數。它會返回一個類似於我得到5.000000,32.0000等的輸出。那麼爲什麼我會得到兩個不同的輸出?

+0

'一/ b'也將進行整數除法,即2/3 => 0. – Thilo

+3

在算術運算中使用整數時,結果將在每個點處截斷爲整數。例如,「10/20 * 20」爲「0」,但「10.0/20.0 * 20.0」爲「10.0」。 –

回答

1

有整數和雙打之間有不少分歧,但如果你的例子是怎麼了?是在這條線:

index = cachesize/blocksize * 1024; 

cachesizeblocksize是雙,他們在做double師,這使得小數地方。

cachesizeblocksize是整數時,他們在做integer除法,它截斷小數。

要修復您的代碼行,你可以轉換的參數之一爲double迫使double師,像這樣:

index = ((double)cachesize/blocksize) * 1024; 

這將讓你的結果:

Offset : 5 
Index : 32 
Index : 5 
Tag : 22 
相關問題