2013-03-17 52 views
3

我有一個字節數組,表示雙:角色的char *加倍 - 以字節爲單位

char number[8]; 

我需要施放此實際雙(其具有8個字節以及)。根據我的建議,我試過這個,但它失敗了:

std::cout<<(*((*double)number))<<" is my number.\n"; 

它爲什麼會失敗,我該怎麼辦?當然,我可以使用一些神奇的東西來提取數據,但我不想這樣做 - 它會消耗內存並使代碼過於健壯。

+0

類似這樣的打字是相當危險的(雖然在'char' IIRC的具體情況下是有效的,至少現在和只要你只使用一種類型)。一般來說,「聯合」更安全,也更方便。使用指針,嚴格的別名總是能夠幫助你。 – delnan 2013-03-17 18:25:04

+0

@delnan,但是從最後沒有設置的聯盟成員讀取的是UB,因爲這是實現定義的(至少該轉換是IIRC)。 – chris 2013-03-17 18:27:27

+0

@chris你不會得到比實現定義更好的東西,該標準甚至沒有指定'char'中有多少位。然而,實現定義比未定義的行爲好得多(這就是你用'*(int *)&a_double' IIRC得到的東西)。更重要的是,即使兩者同樣被標準破壞,許多編譯器都會執行基於類型的別名分析,這可能會破壞代碼使用指針進行類型雙擊,但不會通過聯合IIUC打破類型雙擊。 – delnan 2013-03-17 18:30:28

回答

8

爲什麼會失敗?

您在這裏有一個錯字。

std::cout<<(*((*double)number))<<" is my number.\n"; 

它應該是:

std::cout<<(*((double*)number))<<" is my number.\n"; 

和我應該怎麼辦?

可以減少使用括號的數量。

std::cout<< *(double*)number <<" is my number.\n"; 

應該使用C++蒙上而不是C蒙上,所以很清楚自己在做什麼。

std::cout<< *reinterpret_cast<double*>(number) <<" is my number.\n"; 
+0

我的錯別字將有一天殺死我。謝謝:) – 2013-03-17 18:24:54

+0

+1雖然我會推薦使用'reinterpret_cast (number)'而不是'(double *)number'。 – LihO 2013-03-17 18:26:12

+0

感謝您竊取我的C++答案。 – poitroae 2013-03-17 18:30:21

3

如果您使用C++,則使用reinterpret_cast。正如你所看到的,C++具有更多的表現力。

// cool c++ 
double value = *reinterpret_cast<double*>(number); 

// c style 
double value = (*((double*)number)); 
+2

「爲什麼失敗」? – 2013-03-17 18:22:45

+0

我可以更改原始變量的類型嗎? – 2013-03-17 18:23:18

+0

@OrriBarel:是的,它的確如此。 – LihO 2013-03-17 18:23:24

1
char number[8]; 
double d; 
// number is assumed to be filled with a buffer representing a double. 
memcpy(&d, &number, sizeof(double)); 
std::cout << d; 

如果需要的sizeof不知道。當假定雙字節是8字節時已經處理了損壞。我不知道標準中有關雙打的內容。

+1

該標準指出,儘管我不確定使用的確切措辭是什麼,但雙倍最大可以容納任何「浮動」值。 – Cubic 2013-03-17 18:28:33