[英]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;
}
在這兩種情況下,您只需處理相同的內存,就像它是int
或double
。 這可以生成每個可能的double
值,包括NaN
或Infinity
。
但是,此代碼假定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.