簡體   English   中英

如何將雙精度轉換為浮動指針?

[英]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

解釋:

那是值為10double的內部表示。

通過將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM