为啥java在改变基数之前将数字转换为负数
Posted
技术标签:
【中文标题】为啥java在改变基数之前将数字转换为负数【英文标题】:Why java is converting number to negative before change of radix为什么java在改变基数之前将数字转换为负数 【发布时间】:2021-04-12 09:15:27 【问题描述】:在 Java 中,String Integer::toString(long i, int radix)
使用给定的基数(基数)返回数字 i
的表示形式。在进行转换之前,它会将编号 i
映射到 -i
:
byte[] buf = new byte[65];
int charPos = 64;
boolean negative = (i < 0);
if (!negative)
i = -i;
while (i <= -radix)
buf[charPos--] = (byte)Integer.digits[(int)(-(i % radix))];
i = i / radix;
buf[charPos] = (byte)Integer.digits[(int)(-i)];
我不明白为什么它使用负数而不是正数。在 Java x % y = -((-x) % y)
中,这让我很困惑,因为它不应该有任何区别,因为模运算的结果在代码中被否定了。
【问题讨论】:
这是Integer.toString
还是Long.toString
的来源?
"In Java x % y = (-x) % y" 你确定吗? ideone.com/1eOX4R
7 % 10
与 -7 % 10
非常不同(与 3 % 10
一致)。
@luk2302 你确定吗? -7 % 10 == -(7 % 10)
,如ideone.com/WqQrlU所示。
@luk2302 Wolfram Alpha 不是 Java。
【参考方案1】:
代码不想区别处理正负值,所以想统一符号。
最明显的标准化是将负值转换为正值。这就是我们人类会做的。但是,对于存储在二进制补码中的数字,负数的 取值范围 比正数的取值范围大一,所以如果我们归一化为正数,-2147483648
也就是 @ 会失败987654322@.
【讨论】:
这令人印象深刻。你是怎么知道的? @Trismegistos 我刚刚考虑了这个问题:int
中的负值有什么特别之处。当您之前处理过边缘案例时,-2147483648
没有积极对应的事实就很明显了。以上是关于为啥java在改变基数之前将数字转换为负数的主要内容,如果未能解决你的问题,请参考以下文章
将基数为 10 的数字转换为 .NET 中任何基数的最快方法?