浮点数以16进制打印

zrdongjiao 2013-02-22 11:53:28
float val=FLT_MAX;

DWORD val2=(int)val;


printf("0x%x",val2);

结果为:

0x80000000

为什么结果是这个啊?


#define FLT_MAX 3.402823466e+38F /* max value */

怎么计算的?

...全文
1163 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
云中漫步生 2013-02-26
  • 打赏
  • 举报
回复
引用 7 楼 zrdongjiao 的回复:
引用 6 楼 rocktyt2 的回复:float val=FLT_MAX; printf("0x%x",val); 直接这样就行,你那个转int之后就不是原来的样子了,3楼的转法能保持数据不变 只是想打印根本不需要进行这步转换,printf根本不管你是什么类型的 引用 4 楼 lvkush0903 的回复:可以看看内存中的排列 float的使用一定要小……
我的意思是代码中最好不用float转换为其它的类型。
  • 打赏
  • 举报
回复
不是只有int型才可以10进制 16进制 8进制输出吗?
rocktyt 2013-02-25
  • 打赏
  • 举报
回复
float val=FLT_MAX; printf("0x%x",val); 直接这样就行,你那个转int之后就不是原来的样子了,3楼的转法能保持数据不变 只是想打印根本不需要进行这步转换,printf根本不管你是什么类型的
Athenacle_ 2013-02-25
  • 打赏
  • 举报
回复
楼上的,浮点数的存储方式都是相同的把,,IEEE754。。。 整形数倒是不一定相同的
Athenacle_ 2013-02-25
  • 打赏
  • 举报
回复
这么写把 unsigned int val2 = *((unsigned int*)&val); linux上没DWORD,我就用unsigned int 了
mymtom 2013-02-25
  • 打赏
  • 举报
回复
float val=FLT_MAX; DWORD val2=(int)val; DWORD 无法表示FLT_MAX, 也就是说溢出了。 有些系统val2 = 0x80000000 (INT_MIN) 有的系统val2 = 0x7fffffff (INT_MAX)
zrdongjiao 2013-02-25
  • 打赏
  • 举报
回复
引用 8 楼 rocktyt2 的回复:
引用 7 楼 zrdongjiao 的回复:引用 6 楼 rocktyt2 的回复:float val=FLT_MAX; printf("0x%x",val); 直接这样就行,你那个转int之后就不是原来的样子了,3楼的转法能保持数据不变 只是想打印根本不需要进行这步转换,printf根本不管你是什么类型的 引用 4 楼 lvkush0903 的回复:可以看看……
懂了,这种type不能简单的理解为:拷贝内存 而是进行了很多操作,如2.1f转换为int,会产生很多汇编指令 像2.0f这种, 操作就比较少了
rocktyt 2013-02-25
  • 打赏
  • 举报
回复
引用 7 楼 zrdongjiao 的回复:
引用 6 楼 rocktyt2 的回复:float val=FLT_MAX; printf("0x%x",val); 直接这样就行,你那个转int之后就不是原来的样子了,3楼的转法能保持数据不变 只是想打印根本不需要进行这步转换,printf根本不管你是什么类型的 引用 4 楼 lvkush0903 的回复:可以看看内存中的排列 float的使用一定要小……
你真搞笑,(int)val不是转换类型是什么?连作用都没搞清,自己就给这句代码规定了“将val中内容完整的拷贝到val2中”的功能?你既然知道这句的作用还来问什么 float的结构都没搞清就来“还是怎么地?”,先去看下float的存储方式吧 顺便如果你想复制内存,就老老实实用memcpy
zrdongjiao 2013-02-25
  • 打赏
  • 举报
回复
引用 6 楼 rocktyt2 的回复:
float val=FLT_MAX; printf("0x%x",val); 直接这样就行,你那个转int之后就不是原来的样子了,3楼的转法能保持数据不变 只是想打印根本不需要进行这步转换,printf根本不管你是什么类型的
引用 4 楼 lvkush0903 的回复:
可以看看内存中的排列 float的使用一定要小心,针对不同编译器,在内存中的存放是不同的,切记!!所以消息通信中一定要杜绝采用float。 所以对float不能转来转去。 你这个问题要针对特定编译器来看,当做学习吧,千万别较真。
谁转换类型了? DWORD val2=(int)val; 作用无非是将val中内容完整的拷贝到val2中。 你的意思是大小端会导致问题? 还是怎么地?
云中漫步生 2013-02-23
  • 打赏
  • 举报
回复
可以看看内存中的排列 float的使用一定要小心,针对不同编译器,在内存中的存放是不同的,切记!!所以消息通信中一定要杜绝采用float。 所以对float不能转来转去。 你这个问题要针对特定编译器来看,当做学习吧,千万别较真。
ForestDB 2013-02-22
  • 打赏
  • 举报
回复 3
这样试试。

# include <stdio.h>

int main()
{
    float a = 3.402823466e+38F;
    printf("%lx\n", *((unsigned long *)&a));

    return 0;
}
赵4老师 2013-02-22
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
图灵狗 2013-02-22
  • 打赏
  • 举报
回复
参考http://en.wikipedia.org/wiki/IEEE_floating_point。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧