2015-10-15 59 views
0

我已經寫了下面的代碼:區別正常的演員和指針強制

void union_bytes() { 
    float fnum = 1209.1996f; 
    union endian { 
     float fnum; 
     int inum; 
     unsigned char cnum[4]; 
    }instance; 
    instance.fnum = fnum; 
    printf("Number = %f\nLittle Endian = %.2x %.2x %.2x %.2x\nHex = %x\n", instance.fnum, instance.cnum[0], 
     instance.cnum[1], instance.cnum[2], instance.cnum[3], instance.inum); 
} 

void pointer_bytes() { 
    float fnum = 1209.1996f; 
    int *ptr_inum = (int*)&fnum;; 
    unsigned char *cbytes = (unsigned char *)&fnum; 
    printf("Number = %f\nLittle Endian = %.2x %.2x %.2x %.2x\nHex = %x\n", fnum, cbytes[0], cbytes[1], cbytes[2], cbytes[3], *ptr_inum); 

} 

,我想知道,爲什麼我必須做這樣的事情:爲了得到小端int *ptr_inum = (int*)&fnum;,和我不能這樣做是這樣的:

int inum = (int)fnum; 

我想,最後的選擇力量FNUM失去一些字節,但我仍然不知道電話號碼如何如代表內存(和字節是完全喪失)。

爲什麼在這種情況下:

unsigned char ch[4] = { 0x3b, 0x51, 0x7a, 0x24 }; 
float f = *(float*)ch; 

當涉及到鑄造,CH犯規給第一nible 0x3b這是再浮動,而不是將其轉換所有表複利整個浮動的字節數。

感謝

回答

0

爲什麼我必須做這樣的事情:整數ptr_inum =爲了 得到小端(INT)&fnum;,我不能這樣做是這樣的:INT INUM = ( INT)FNUM;

這裏有一些術語混淆。 Little-endian是多字節結構的特定字節順序,通常與big-endian相反。

你所得到的是作爲第一條語句的執行結果是: 使指向整點到一個浮點數被存儲的位置的變量,這樣以後它的字表示可以通過int檢索/修改int。假設,對於IEEE-754兼容實現中的數字1.9,is represented as 0x3ff33333,所以在小端架構上,如果你的int是32位,你會得到0x3ff33333。

第二條語句意味着:給我一個整型變量,它是浮點數的結果。通過標準,這意味着下降的小數,所以出1.9你會得到1.

+0

所以我想在這裏:unsigned char ch [4] = {0x3b,0x51,0x7a,0x24}; float f = *(float *)ch;編譯器使用下一個字節填充剩餘的字節,因爲它可以填充4個字節? – DonkeyDoe

+0

ch是一個指向unsigned char的const指針,所以(float)ch是一個嘗試將指針(即地址)轉換爲浮點數。這是沒有道理的,是非法的。 – mzu

+0

如果你的意思是'*(float *)ch',那麼計算機會嘗試將這4個字節解釋爲一些浮點數(本例中爲5.4278914E-17) – mzu