Java 将double缩小为int的规则
请注意,我不是在寻找代码来转换或缩小双精度到int的范围 依照 有符号整数到整数类型T的缩小转换 只需丢弃除n个最低阶位以外的所有位,其中n是数字 用于表示类型T的位的数目 因此,当我尝试将260(二进制表示法为Java 将double缩小为int的规则,java,Java,请注意,我不是在寻找代码来转换或缩小双精度到int的范围 依照 有符号整数到整数类型T的缩小转换 只需丢弃除n个最低阶位以外的所有位,其中n是数字 用于表示类型T的位的数目 因此,当我尝试将260(二进制表示法为1000000000)缩小到一个字节时,结果是4,因为最低的8位是00000100,它是十进制4或长值4294967296L(二进制表示法为1000000000000000000000000),结果是0 现在,为什么我想知道将规则从double缩小到int、byte等的规则是当我缩小一个
1000000000
)缩小到一个字节时,结果是4,因为最低的8位是00000100
,它是十进制4或长值4294967296L(二进制表示法为1000000000000000000000000
),结果是0
现在,为什么我想知道将规则从double缩小到int、byte等的规则是当我缩小一个double
值4294967296.0
时,结果是2147483647
但当我缩小一个长4294967296L
值时,结果是0
我已经理解了将长窄化为int、byte等(丢弃除n个最低阶位以外的所有位),但我想知道在双窄化的情况下会发生什么。将双精度转换为整数时,结果是Integer.MAX\u值,并且该值超出了整数的范围。Integer.MAX_值为2^31-1。当您从双精度值4294967296.0开始时,它大于最大长值2147483647,因此应用以下规则(从您引用的页面开始):该值必须太大(大幅度的正值或正无穷大),第一步的结果是int或long类型的最大可表示值,得到0x7FFFFFF=2147483647 但是,当您尝试转换4294967296L=0x100000000时,您从整数类型开始,因此规则是:有符号整数到整数类型T的窄化转换只会丢弃除n个最低顺序位以外的所有位,因此如果n小于32(8字节),则只会得到0 我已经理解了将长窄化为int、byte等(丢弃除n个最低阶位以外的所有位),但我想知道在双重窄化的情况下会发生什么 。。。我想了解为什么和如何部分
int
)为:
- 一个NaN变成零
- Inf变为“最大整数”或“最小整数”
- 否则:
- 向零取整得到一个数学整数
- 如果四舍五入的数字对于
而言太大,结果将变为“min int”或“max int”int
- 这很容易理解 与C/C++、
答案是在你引用的那一行后面的几行:将浮点数缩小为整数类型T需要两个步骤:[……]我确实读过,但我真的无法从中得到答案。我可以理解它将从1.b开始执行,但无法理解如何执行。如果你能解释一下,我将不胜感激。我想最终会理解IEEE 754四舍五入规定的双浮变窄规则。@hagrawal:“该值必须太大(大幅度的正值或正无穷大),第一步的结果是int或long类型的最大可表示值。”..@OliverCharlesworth感谢您的输入。如果我使用上面提到的算法,那么这是真的“如果浮点数不是无穷大,则浮点值被四舍五入为整数值V,使用IEEE 754向零舍入模式向零舍入”,因为我的数字是4294967296.0,这不是无限的。这意味着现在将使用IEEE 754向零舍入模式向零舍入。否?问题是如何和为什么。规范没有说为什么,只是说这是结果。是的,我同意,但我想了解为什么和如何部分。页面上说:“值必须太大(大幅度的正值或正无穷大),第一步的结果是int或long类型的最大可表示值。”“我不确定这里的情况是否如此,我也发表了同样的评论。谢谢你的意见。如果我使用上面提到的算法,那么这是真的“如果浮点数不是无穷大,则浮点值被四舍五入为整数值V,使用IEEE 754向零舍入模式向零舍入”,因为我的数字是4294967296.0,这不是无限的。这意味着现在将使用IEEE 754向零舍入模式向零舍入。否?Long.MAX_VALUE=9223372036854775807感谢您的输入。哦,好的。我现在明白了。我想我之所以困惑是因为JLS中的评论(或者可能有困惑)。如果我的理解是错误的,请纠正我-根据那里的algo步骤,#1“的第三个项目符号,否则,以下两种情况之一必须为真:“将在浮点为无穷大时执行”(这意味着#的第二个项目符号为假)以及在#2中四舍五入后,如果结果不能表示为long或int。如果您可以让我知道您的输入,那么我们可以结束此操作。请让我知道,如果上述评论是不清楚的