作者jackblack ()
看板java
标题Re: [问题] 预设整数 int 浮点数 double
时间Sun Jan 24 22:44:39 2016
※ 引述《chenhung (小胡子)》之铭言:
: 大家好
: 我有一个问题想要请问
: 书上写,整数值的预设型别为 int
: 读到整数数值时,会先取得 4byte 的记忆体空间暂时储存
: 然後再把值复制到指定的变数所代表的记忆体空间储存
: 若程式码的数值未超过 int 最大或最小值
: 自然没问题 举例: byte a=8
: 浮点数的预设型别为 double
: 读到浮点数值时,会预设取得 8byte 的记忆体空间暂时储存
: 然後再把值复制到指定的变数所代表的记忆体空间储存
: 若配置给变数的记忆体空间是 8byte 自然没问题
: 若小於 8byte 则会产生型别不符的错误
: 举例: float b=3.0 //错误
: 我的问题就是:byte a=8,是 预设 int 4byte 放入 byte 1byte,这样就可以
: 可是 float b=3.0,是预设 double 8byte 放入 float 4byte ,这样就不行
: 请问是为什麽呢?
: byte a=8 //正确 float b=3.0 //错误
: 1byte 预设 int 4byte 4 byte 预设 double 8byte
: 同样都是大放小,为什麽 整数可以 浮点数不行 = =
: 如果标题取的不好,我再更改 @@
: 谢谢
不好意思回覆这篇多年前的文章
但最近我也被这个问题困扰
有想到一个可能的原因
不知道对不对
也希望板上的高手能为小弟解惑
--------------------------------------------
double 可储存的小数位数最大为 15,范围是 -1.8*10^308 ~ 1.8*10^308
float 可储存的小数位数最大为 7,范围是 -3.4*10^38 ~ 3.4*10^38
加上浮点数实字预设是 double 型态
所以有可能会发生「float f = 1.12345678;」这样超过 float 最大小数位数的情形
并且 1.12345678 = 1.12345678*10^0 没有超过 float 的范围
所以必须以「float f = 1.1234567f;」表示用 float 来储存 1.1234567
因此「float b = 3.0;」会编译错误(可能有精准度问题)
而「int a = 8;」则编译成功(整数没有精准度问题)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.240.120
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1453646683.A.64A.html
※ 编辑: jackblack (122.116.240.120), 01/24/2016 22:50:40
2F:→ jackblack: 请问「程式中写下一个整数时,预设是使用不超过int型态 01/26 21:38
3F:→ jackblack: 长度」的意思是什麽呢? 01/26 21:39
4F:→ jackblack: 整数实字预设不是 int 型态吗? 01/26 21:58
5F:推 jinn: 2F 因为用int型态,所以数字长度不能超过int啊。没冲突啊XD 01/27 20:48
@jinn: 疑问的点是为什麽 double 指派给 float,与 int 指派给 byte 同样是大放到小
,但是 int 指派给 byte、short 就不用像 double 还要改用 float 存值?
後来在《Java in a Nutshell》中找到解答:
http://docstore.mik.ua/orelly/java-ent/jnut/ch02_04.htm
The one exception to this rule is that you can assign an integer literal (an
int value) to a byte or short variable, if the literal falls within the range
of the variable.
中文第六版(P.29):
限缩转型规则有个例外,就是可以把整数字面常数(int 型别)指定给 byte 或 short 型
别变数,但前提必须是该数值不能超过变数型别的值域范围。
※ 编辑: jackblack (122.116.240.120), 01/27/2016 23:46:59
6F:推 longlongint: 有没有试过3.0f 01/31 12:39