【C/C++】将32位int转化为double

本文介绍了如何在C/C++中将32位整型数值转换为double类型,通过深入解析V8引擎源码中的实现方式,揭示底层转换原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闲来无事,看看了V8的代码,在V8.cc中有这么一段:

// Use a union type to avoid type-aliasing optimizations in GCC.
typedef union {
  double double_value;
  uint64_t uint64_t_value;
} double_int_union;


Object* V8::FillHeapNumberWithRandom(Object* heap_number, Isolate* isolate) {
  uint64_t random_bits = Random(isolate);
  // Make a double* from address (heap_number + sizeof(double)).
  double_int_union* r = reinterpret_cast<double_int_union*>(
      reinterpret_cast<char*>(heap_number) +
      HeapNumber::kValueOffset - kHeapObjectTag);
  // Convert 32 random bits to 0.(32 random bits) in a double
  // by computing:
  // ( 1.(20 0s)(32 random bits) x 2^20 ) - (1.0 x 2^20)).
  const double binary_million = 1048576.0;
  r->double_value = binary_million;
  r->uint64_t_value |=  random_bits;
  r->double_value -= binary_million;

  return heap_number;
}

乍看这段代码,让人有点摸不着头脑。看注释的意思,他是想将32位的整形转化为小数,实现方式倒是蛮特别。

google了一下double的存储方式,根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:

   V = (-1)^s×M×2^E

(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

(2)M表示有效数字,大于等于1,小于2。

(3)2^E表示指数位。


s 对应下图中的第0位,M对应1-11位,M对应12-51位。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值