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中双变量的实际格式。