簡體   English   中英

通過附加兩個int的二進制表示來創建double

[英]Create double by appending binary representations of two ints

我試圖通過附加兩個int的二進制表示來創建一個double 這就是我現在擁有的:

int i = arc4random();
*(&i+1) = arc4random();
double d = *(double*)&i;

我希望double指針也會使用&i+1地址中的值,這確實是這種情況。 當我打印i*(&i+1)的二進制表示並將它們與d的二進制表示進行比較時,d由附加*(&i+1)i 所以*(&i+1)首先出現?! 為什么會這樣?

編輯:還要看看Juan Catalan和Mark Segal的答案,知道使用工會做什么的正確方法。

改為使用union 您仍然可以生成NaN但不會有內存管理問題。

這是一個的整個目的union ,分享幾種不同類型之間的內存塊。

確保在您的體系結構中sizeof(double)等於sizeof(int)兩倍

您可以使用聯合,如下所示:

typedef union {
    double d;
    struct {
        int a;
        int b;
    } integers;
} double_generator;

int main(void) {
    double_generator g;
    g.integers.a = arc4random();
    g.integers.b = arc4random();

    // g.d is now a "randomly generated double"

    return 0;
}

或者“手動”,可能不安全,自己完成這項工作:

int main(void) {
    double d;
    *((int *)&d) = arc4random();
    *(((int *)&d) + 1) = arc4random();
    printf("%f", d);
    return 0;
}

在這兩種情況下,您只需處理相同的內存,就像它是intdouble 這可以生成每個可能的double值,包括NaNInfinity

但是,此代碼假定sizeof(double)是(至少) sizeof(int)兩倍。 如果不是,則必須引入不同的代碼來處理它。

當我打印i和*(&i + 1)的二進制表示並將它們與d的二進制表示進行比較時,d由附加*(&i + 1)和i組成。 所以*(&i + 1)首先出現?! 為什么會這樣?

字節的實際排序取決於底層硬件架構的“Endian-ness”。

與小Endian架構:

1) the lowest address byte contains the least significant 8 bits of the total variable  
2) the highest address byte contains the most significant 8 bits of the total variable.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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