Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过附加两个整数的二进制表示形式创建double_C_Binary_Double_Bit Manipulation_Arc4random - Fatal编程技术网

C 通过附加两个整数的二进制表示形式创建double

C 通过附加两个整数的二进制表示形式创建double,c,binary,double,bit-manipulation,arc4random,C,Binary,Double,Bit Manipulation,Arc4random,我试图通过附加两个ints的二进制表示来创建一个double。这就是我现在拥有的: int i = arc4random(); *(&i+1) = arc4random(); double d = *(double*)&i; 我希望double指针也会使用&I+1地址中的值,事实确实如此。当我打印I和*(&I+1)的二进制表示形式,并将它们与d的二进制表示形式进行比较时,d由添加*(&I+1)和I组成。所以*(&i+1)是第一位的?!为什么会这样 编辑:还可以看看胡安·卡塔兰和

我试图通过附加两个
int
s的二进制表示来创建一个
double
。这就是我现在拥有的:

int i = arc4random();
*(&i+1) = arc4random();
double d = *(double*)&i;
我希望
double
指针也会使用
&I+1
地址中的值,事实确实如此。当我打印
I
*(&I+1)
的二进制表示形式,并将它们与
d
的二进制表示形式进行比较时,d由添加
*(&I+1)
I
组成。所以
*(&i+1)
是第一位的?!为什么会这样


编辑:还可以看看胡安·卡塔兰和马克·西格尔的答案,了解我使用工会的正确做法。

改用
工会。您仍然可以生成NaN,但不会出现内存管理问题


这是
联合
的全部目的,在几种不同类型之间共享一个内存块


确保在您的体系结构中
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;
}
在这两种情况下,只需寻址相同的内存,就像它是
int
double
一样。这可能会生成所有可能的
值,包括
NaN
无限

但是,此代码假定
sizeof(double)
至少是
sizeof(int)
的两倍。如果不是,则必须引入不同的代码来处理

当我打印I和*(&I+1)的二进制表示并比较 它们以二进制形式表示d,d由附加 *(&i+1)和i。所以*(&i+1)排在第一位?!为什么会这样

字节的实际顺序取决于底层硬件体系结构的“端序”

使用little 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.

不要这样做!您正在使用未分配给变量的内存来调用未定义的行为。。还请记住,使用此方案可以生成
NaN
。请改用
union
。您仍然可以生成
NaN
,但不会出现内存管理问题。这是
联合的全部目的,在几种不同类型之间共享内存块。但是要小心
sizeof(int)
您必须确保它是架构中
double
大小的一半。double值不是一行中的两个int值。请阅读其中讨论了C中双变量的实际格式。