为什么溢出?

[复制链接]
查看11 | 回复3 | 2013-3-20 11:06:20 | 显示全部楼层 |阅读模式
这是因为 long 和 double 的表示范围不同, 表达式是先计算 c*789,c 是 long int 类型, 789编译器默认使用 int 的类型,long int * int, 结果结果会用 long int 类型的编译器中间变量来存储, 这个结果再赋值给 double 类型变量 f, 溢出是在计算 466438237*789 时发生的表达式 (double)c*789 在编译器中, c 是 long int 类型, 789 编译器默认使用 int 的类型,但是在计算之前会经过 double 强制转化, 所以是 double * int, 结果会用 double 类型的编译器中间变量来存储, 之后将这个值赋值给 dou...
回复

使用道具 举报

千问 | 2013-3-20 11:06:20 | 显示全部楼层
原因很简单,虽然long 和double在内存中都是占64位二进制位,但他们能表示的值域范围是不一样的signed long 值域 为 -(2^63-1) ~ (2^63-1)的整数unsigned long值域 为0~2^64-1 的整数而double类型在内存中存储方式是不一样的比如double a=12.2345实际上他...
回复

使用道具 举报

千问 | 2013-3-20 11:06:20 | 显示全部楼层
c*789是 整数*整数,得到的结果是整数。整数赋值给double时,需要转换。通过(double)c就把C转换成了double型,乘法结果也为double型。...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行