由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问题: C++ static_cast between int and float
相关主题
请教个static_cast vs reinterpret_cast的问题。问一个C++文件读取的问题
c++ cast problem看道c++题: brianbench
pointer overflowc++ 是否也有class method??
C++ cast 小结C++默认的copy constructor的疑惑
问两个问题,C++C++编程问题,关于static member 在class中的使用,谢谢
this和&*this的区别C++字符类型问题
国内的编程论坛很不自由有没有啥package可以统计程序的浮点运算量的?
reinterpret cast的问题问一个C语言中整型和浮点运算的问题 (转载)
相关话题的讨论汇总
话题: float话题: cast话题: int话题: std话题: undefined
进入Programming版参与讨论
1 (共1页)
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位有
: 效数字吧。这种问题应该自己一看到就明白那种。

相关主题
this和&*this的区别问一个C++文件读取的问题
国内的编程论坛很不自由看道c++题: brianbench
reinterpret cast的问题c++ 是否也有class method??
进入Programming版参与讨论
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?

1 (共1页)
进入Programming版参与讨论
相关主题
问一个C语言中整型和浮点运算的问题 (转载)问两个问题,C++
c++ singleton questionsthis和&*this的区别
一个dot net浮点运算的问题国内的编程论坛很不自由
C++ interview questions helpreinterpret cast的问题
请教个static_cast vs reinterpret_cast的问题。问一个C++文件读取的问题
c++ cast problem看道c++题: brianbench
pointer overflowc++ 是否也有class method??
C++ cast 小结C++默认的copy constructor的疑惑
相关话题的讨论汇总
话题: float话题: cast话题: int话题: std话题: undefined