深入理解计算机系统这本书中的一个问题。。。求大神

囧囧骚年 2016-01-18 09:42:33
int x;
x==(int)(float)x 这句逻辑语句是否一定正确?书上说x=Tmax时不成立?
...全文
262 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
囧囧骚年 2016-01-21
  • 打赏
  • 举报
回复
引用 2楼HeBanBei 的回复:
int x; x==(int)(float)x 先解释一下书上这么说到底是什么意思。 1、先把x从int转换为float类型 2、再从float类型转换为int类型 最后,问:两次转换之后的结果与原来的值是否一定相等? 解答:不一定相等。 原因是,第一次转换时,也就是从int转为float时,可能出现不相等的情况。 我们知道,int是4个字节表示一个整数,float是4个字节表示一个浮点数。 所以,int的精度比float高。 int的有效数字可以是10位,而float只有6,7位。 所以,你只要把x的取值先设定为10个有效数字,比如 2123456789,你就能很快得到验证。 但是,如果你代码里这么写,可能得不到想要的结果。 原因可能是编译器给你优化了。 有一个方法,你可以设一个中间变量 float类型,然后分两次转换。
恍然大悟,谢谢啦,
HeBanBei 2016-01-19
  • 打赏
  • 举报
回复
int x; x==(int)(float)x 先解释一下书上这么说到底是什么意思。 1、先把x从int转换为float类型 2、再从float类型转换为int类型 最后,问:两次转换之后的结果与原来的值是否一定相等? 解答:不一定相等。 原因是,第一次转换时,也就是从int转为float时,可能出现不相等的情况。 我们知道,int是4个字节表示一个整数,float是4个字节表示一个浮点数。 所以,int的精度比float高。 int的有效数字可以是10位,而float只有6,7位。 所以,你只要把x的取值先设定为10个有效数字,比如 2123456789,你就能很快得到验证。 但是,如果你代码里这么写,可能得不到想要的结果。 原因可能是编译器给你优化了。 有一个方法,你可以设一个中间变量 float类型,然后分两次转换。
赵4老师 2016-01-19
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!) VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
paschen 2016-01-18
  • 打赏
  • 举报
回复
确实当int取最大正值是不相等了,浮点数误差(int)(float)x 后变成了绝对值最大的负数

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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