[英]How to cast double to float pointer?
我正在嘗試將 double 轉換為浮點指針,但我不知道正確的方法。
這是我的代碼
#include <iostream>
int main(int argc, const char * argv[]) {
// insert code here...
float *f;
double d = 10;
f = reinterpret_cast<float*>(&d);
d = 20;
std::cout << "RESULT : " << *f << std::endl;
return 0;
}
我得到以下結果。
RESULT : 0
Program ended with exit code: 0
如何正確地將 double 轉換為浮點指針?
添加:我期望得到的結果是 20
考慮:
#include <cstdio>
#include <cassert>
using namespace std;
int main()
{
double d = 10;
float f;
assert( sizeof d == 8 );
assert( sizeof f == 4 );
unsigned char * d_ = (unsigned char *)&d;
printf( "%hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx\n", d_[0], d_[1], d_[2], d_[3], d_[4], d_[5], d_[6], d_[7] );
}
至少在我的機器上,這給出了以下輸出:
0 0 0 0 0 0 24 40
解釋:
那是值為10
的double
的內部表示。
通過將double *
為float *
,您只查看它的前四個字節 - 0 0 0 0
。 當您取消引用指針時,您是否明白為什么會得到0
輸出?
(除此之外,正如其他人所指出的,由於打破了嚴格的別名,指針的取消引用是未定義的行為。)
解決方法:
您可能想要的是轉換d
的值:
static_cast<float>(d);
然后,您可以將該值存儲在正確類型的對象中:
float f = static_cast<float>(d);
float * fp = &f;
您用於投射指針的代碼是正確的。
錯誤是*f
,它通過違反嚴格的別名規則導致未定義的行為。 您不能通過指針讀取或寫入其指向的對象類型錯誤的指針。 (有一小部分例外情況)。
行為未定義:語言沒有提供這樣做的方法。 例如, sizeof(float*)
不必與sizeof(double*)
。 C++ 旨在最大限度地提高靈活性。
您可以將double
的地址轉換為const unsigned char*
指針並以這種方式讀取內存。
否則,您需要求助於匯編,在 CPU 級別,指向類型的指針和整數類型之間的區別相當模糊。
如果要將double
轉換為float
,請編寫
double d = 10; float f = d;
您想要做的是縮小static_cast
:
auto f = static_cast<float>(d);
float* pointer = &f;
使用reinterpret_cast
將失敗,因為它不會發出編譯器將double
的按位表示更改為float
的按位表示。 從字面上看,它會將 double 值重新解釋為浮點數,隨着表示形式的不同,會產生奇怪且未定義的結果。 另一邊的static_cast
會照顧你正確調整表示,如有必要,可能會截斷最低有效位。 在此之后,您可以安全地使用浮點變量的地址並使用指針訪問該值。
您想要的行為可以在 C++ 中實現。 雖然不是通過原始指針,但 C++ 允許用戶定義類型。
class double_as_float {
double& d;
public:
double_as_float(double& d) : d(d) { }
float operator*() const { return static_cast<float>(d); }
};
用法:
#include <iostream>
int main() {
double d = 10;
double_as_float f { d };
d = 20;
std::cout << "RESULT : " << *f << std::endl;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.