i***h 发帖数: 12655 | 1 需要用一个float存整数:
int i = 0x24240102;
float f = static_cast(i);
std::cout << std::hex << static_cast(f) << std::endl;
结果出来是:
24240100
尾巴上那个02变成00了.
为什么? |
S**I 发帖数: 15689 | 2 Learn how float numbers are represented in binary forms first, then you'll
understand.
【在 i***h 的大作中提到】 : 需要用一个float存整数: : int i = 0x24240102; : float f = static_cast(i); : std::cout << std::hex << static_cast(f) << std::endl; : 结果出来是: : 24240100 : 尾巴上那个02变成00了. : 为什么?
|
t****t 发帖数: 6806 | 3 你这么老的鸟问这么幼齿的问题不应该啊.
【在 i***h 的大作中提到】 : 需要用一个float存整数: : int i = 0x24240102; : float f = static_cast(i); : std::cout << std::hex << static_cast(f) << std::endl; : 结果出来是: : 24240100 : 尾巴上那个02变成00了. : 为什么?
|
i***h 发帖数: 12655 | 4 被鄙视鸟.
这种东西, 平时用着不出错就用了, 没深入学习过.
理解中就是把这个当memcpy使的, 看来是不对的
整数是0x24240102, 就是
(24) 0010 0100 (24) 0010 0100 (01) 0000 0001 (01) 0000 0010
浮点表示是 1 bit sign, 8 bit exponent, 23 bit significant
上面就变成:
(0) (010 0100 0) (010 0100 0000 0001 0000 0010)
呣... 还是看不出为什么最后的 0010 会变成 0000
求解释
【在 t****t 的大作中提到】 : 你这么老的鸟问这么幼齿的问题不应该啊.
|
t****t 发帖数: 6806 | 5 no, try to google static_cast.
【在 i***h 的大作中提到】 : 被鄙视鸟. : 这种东西, 平时用着不出错就用了, 没深入学习过. : 理解中就是把这个当memcpy使的, 看来是不对的 : 整数是0x24240102, 就是 : (24) 0010 0100 (24) 0010 0100 (01) 0000 0001 (01) 0000 0010 : 浮点表示是 1 bit sign, 8 bit exponent, 23 bit significant : 上面就变成: : (0) (010 0100 0) (010 0100 0000 0001 0000 0010) : 呣... 还是看不出为什么最后的 0010 会变成 0000 : 求解释
|
F5 发帖数: 151 | 6
10
this is from head to toe?
【在 i***h 的大作中提到】 : 被鄙视鸟. : 这种东西, 平时用着不出错就用了, 没深入学习过. : 理解中就是把这个当memcpy使的, 看来是不对的 : 整数是0x24240102, 就是 : (24) 0010 0100 (24) 0010 0100 (01) 0000 0001 (01) 0000 0010 : 浮点表示是 1 bit sign, 8 bit exponent, 23 bit significant : 上面就变成: : (0) (010 0100 0) (010 0100 0000 0001 0000 0010) : 呣... 还是看不出为什么最后的 0010 会变成 0000 : 求解释
|
S**I 发帖数: 15689 | 7 If you use double type intead of float, you can get what you want (still not
safe though).
【在 i***h 的大作中提到】 : 被鄙视鸟. : 这种东西, 平时用着不出错就用了, 没深入学习过. : 理解中就是把这个当memcpy使的, 看来是不对的 : 整数是0x24240102, 就是 : (24) 0010 0100 (24) 0010 0100 (01) 0000 0001 (01) 0000 0010 : 浮点表示是 1 bit sign, 8 bit exponent, 23 bit significant : 上面就变成: : (0) (010 0100 0) (010 0100 0000 0001 0000 0010) : 呣... 还是看不出为什么最后的 0010 会变成 0000 : 求解释
|
i***h 发帖数: 12655 | 8 也就是说static_cast 读了整数
然后试图把数字用浮点表达, 最后几位因为精度不够被舍弃了
除了用指针或者memcpy(), 还有别的办法把int 的内容直接理解成浮点么?
float f = reinterpret_cast(i);
编译不通过
【在 t****t 的大作中提到】 : no, try to google static_cast.
|
b***i 发帖数: 3043 | 9 float一共就32bit, 其中指数要占用多少位,符号一位,一共就没多少位,最多7位有
效数字吧。这种问题应该自己一看到就明白那种。
【在 i***h 的大作中提到】 : 需要用一个float存整数: : int i = 0x24240102; : float f = static_cast(i); : std::cout << std::hex << static_cast(f) << std::endl; : 结果出来是: : 24240100 : 尾巴上那个02变成00了. : 为什么?
|
F5 发帖数: 151 | 10 想起来了...任何一本书上都这么写这,6-7位...
【在 b***i 的大作中提到】 : float一共就32bit, 其中指数要占用多少位,符号一位,一共就没多少位,最多7位有 : 效数字吧。这种问题应该自己一看到就明白那种。
|
|
|
t****t 发帖数: 6806 | 11 union {
int i;
float f;
};
reinterpret_cast<> is to convert between pointers and integral types. no
float allowed.
using float* to access int* (no matter cast with reinterpret_cast or (type)
cast) is undefined, don't try that. it is subtle and not easy to discover,
but will blow up eventually.
【在 i***h 的大作中提到】 : 也就是说static_cast 读了整数 : 然后试图把数字用浮点表达, 最后几位因为精度不够被舍弃了 : 除了用指针或者memcpy(), 还有别的办法把int 的内容直接理解成浮点么? : float f = reinterpret_cast(i); : 编译不通过
|
i***h 发帖数: 12655 | 12 没办法, legacy code, 改API很麻烦
要用已有的data field存新的东西
我也不想玩这种把戏
)
【在 t****t 的大作中提到】 : union { : int i; : float f; : }; : reinterpret_cast<> is to convert between pointers and integral types. no : float allowed. : using float* to access int* (no matter cast with reinterpret_cast or (type) : cast) is undefined, don't try that. it is subtle and not easy to discover, : but will blow up eventually.
|
t****t 发帖数: 6806 | 13 let me repeat, it's undefined if you do it directly instead of union. it
will backfire. compiler may even IGNORE what you write. if you want to do it
, do it correctly and do it safe, use union.
【在 i***h 的大作中提到】 : 没办法, legacy code, 改API很麻烦 : 要用已有的data field存新的东西 : 我也不想玩这种把戏 : : )
|
i***h 发帖数: 12655 | 14 看来用union 搞定浮点,
然后把这个浮点放API比较安全
用memcpy也可以吧?
it
【在 t****t 的大作中提到】 : let me repeat, it's undefined if you do it directly instead of union. it : will backfire. compiler may even IGNORE what you write. if you want to do it : , do it correctly and do it safe, use union.
|
i***h 发帖数: 12655 | 15 嗯, 用memcpy效率不如union
【在 i***h 的大作中提到】 : 看来用union 搞定浮点, : 然后把这个浮点放API比较安全 : 用memcpy也可以吧? : : it
|
a***n 发帖数: 538 | 16 int i = 0x24240102;
float f = *reinterpret_cast(&i);
std::cout << std::hex << *reinterpret_cast(&f) << std::endl; |
t****t 发帖数: 6806 | 17 as i said, this is undefined.
【在 a***n 的大作中提到】 : int i = 0x24240102; : float f = *reinterpret_cast(&i); : std::cout << std::hex << *reinterpret_cast(&f) << std::endl;
|
h*****f 发帖数: 248 | 18 casting to void* to trick the compiler not to do anything:
int i = 0x24240102;
float f = *(float*)(void*)(&i);
std::cout << std::hex << *(int*)(void*)&f << std::endl; |
t****t 发帖数: 6806 | 19 this is undefined as well.
【在 h*****f 的大作中提到】 : casting to void* to trick the compiler not to do anything: : int i = 0x24240102; : float f = *(float*)(void*)(&i); : std::cout << std::hex << *(int*)(void*)&f << std::endl;
|
h*****f 发帖数: 248 | 20 Really?
I thought casting to void* always made it point to the first byte -- defined
behavior, and then casting back also made it point to the first byte --
defined behavior as well.
No? |
t****t 发帖数: 6806 | 21 casting itself is defined. but using casted pointer to access a different
type of value is undefined, unless certain conditions are met. specifically,
using floating pointer to access integer value, or vice versa, are both
undefined.
defined
【在 h*****f 的大作中提到】 : Really? : I thought casting to void* always made it point to the first byte -- defined : behavior, and then casting back also made it point to the first byte -- : defined behavior as well. : No?
|