我有一個字節數組,表示雙:角色的char *加倍 - 以字節爲單位
char number[8];
我需要施放此實際雙(其具有8個字節以及)。根據我的建議,我試過這個,但它失敗了:
std::cout<<(*((*double)number))<<" is my number.\n";
它爲什麼會失敗,我該怎麼辦?當然,我可以使用一些神奇的東西來提取數據,但我不想這樣做 - 它會消耗內存並使代碼過於健壯。
我有一個字節數組,表示雙:角色的char *加倍 - 以字節爲單位
char number[8];
我需要施放此實際雙(其具有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";
和我應該怎麼辦?
您可以減少使用括號的數量。
std::cout<< *(double*)number <<" is my number.\n";
您應該使用C++蒙上而不是C蒙上,所以很清楚自己在做什麼。
std::cout<< *reinterpret_cast<double*>(number) <<" is my number.\n";
如果您使用C++,則使用reinterpret_cast。正如你所看到的,C++具有更多的表現力。
// cool c++
double value = *reinterpret_cast<double*>(number);
// c style
double value = (*((double*)number));
「爲什麼失敗」? – 2013-03-17 18:22:45
我可以更改原始變量的類型嗎? – 2013-03-17 18:23:18
@OrriBarel:是的,它的確如此。 – LihO 2013-03-17 18:23:24
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字節時已經處理了損壞。我不知道標準中有關雙打的內容。
該標準指出,儘管我不確定使用的確切措辭是什麼,但雙倍最大可以容納任何「浮動」值。 – Cubic 2013-03-17 18:28:33
類似這樣的打字是相當危險的(雖然在'char' IIRC的具體情況下是有效的,至少現在和只要你只使用一種類型)。一般來說,「聯合」更安全,也更方便。使用指針,嚴格的別名總是能夠幫助你。 – delnan 2013-03-17 18:25:04
@delnan,但是從最後沒有設置的聯盟成員讀取的是UB,因爲這是實現定義的(至少該轉換是IIRC)。 – chris 2013-03-17 18:27:27
@chris你不會得到比實現定義更好的東西,該標準甚至沒有指定'char'中有多少位。然而,實現定義比未定義的行爲好得多(這就是你用'*(int *)&a_double' IIRC得到的東西)。更重要的是,即使兩者同樣被標準破壞,許多編譯器都會執行基於類型的別名分析,這可能會破壞代碼使用指針進行類型雙擊,但不會通過聯合IIUC打破類型雙擊。 – delnan 2013-03-17 18:30:28